Renamed project folders to match the respective project name
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 30 May 2019 04:34:12 +0000 (06:34 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Thu, 30 May 2019 04:34:12 +0000 (06:34 +0200)
230 files changed:
LogicUI/.classpath [deleted file]
LogicUI/.gitignore [deleted file]
LogicUI/.project [deleted file]
LogicUI/.settings/org.eclipse.jdt.core.prefs [deleted file]
LogicUI/.settings/org.eclipse.jdt.ui.prefs [deleted file]
LogicUI/META-INF/MANIFEST.MF [deleted file]
LogicUI/build.properties [deleted file]
LogicUI/oldsrc/GUIMerger.java [deleted file]
LogicUI/oldsrc/GUIMux.java [deleted file]
LogicUI/oldsrc/GUISplitter.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/ColorHelper.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/LogicExecuter.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/LogicUICanvas.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/examples/RSLatchExample.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/ViewModel.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/GUIAndGate.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/GUIComponent.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/GUINotGate.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/GUIOrGate.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/wires/GUIWire.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/wires/MovablePin.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/wires/Pin.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java [deleted file]
LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java [deleted file]
SampleERCP/.classpath [deleted file]
SampleERCP/.gitignore [deleted file]
SampleERCP/.project [deleted file]
SampleERCP/.settings/org.eclipse.jdt.core.prefs [deleted file]
SampleERCP/.settings/org.eclipse.jdt.ui.prefs [deleted file]
SampleERCP/.settings/org.eclipse.ltk.core.refactoring.prefs [deleted file]
SampleERCP/.settings/org.eclipse.pde.prefs [deleted file]
SampleERCP/.settings/org.eclipse.wst.sse.core.prefs [deleted file]
SampleERCP/.settings/org.sonarlint.eclipse.core.prefs [deleted file]
SampleERCP/Application.e4xmi [deleted file]
SampleERCP/LICENSE [deleted file]
SampleERCP/META-INF/MANIFEST.MF [deleted file]
SampleERCP/OSGI-INF/l10n/bundle.properties [deleted file]
SampleERCP/build.properties [deleted file]
SampleERCP/css/default.css [deleted file]
SampleERCP/icons/af.png [deleted file]
SampleERCP/icons/app/ico_128t.png [deleted file]
SampleERCP/icons/app/ico_16t.png [deleted file]
SampleERCP/icons/app/ico_24t.png [deleted file]
SampleERCP/icons/app/ico_256t.icns [deleted file]
SampleERCP/icons/app/ico_256t.png [deleted file]
SampleERCP/icons/app/ico_256t.xpm [deleted file]
SampleERCP/icons/app/ico_32t.png [deleted file]
SampleERCP/icons/app/ico_48t.png [deleted file]
SampleERCP/icons/app/ico_64t.png [deleted file]
SampleERCP/icons/app/ico_all.ico [deleted file]
SampleERCP/icons/embedded.png [deleted file]
SampleERCP/icons/enterprise.png [deleted file]
SampleERCP/icons/home.png [deleted file]
SampleERCP/icons/languages.png [deleted file]
SampleERCP/icons/open_in_app.png [deleted file]
SampleERCP/icons/rcp.png [deleted file]
SampleERCP/icons/save_edit.png [deleted file]
SampleERCP/net.mograsim.rcp.product [deleted file]
SampleERCP/plugin.xml [deleted file]
SampleERCP/schema/splashExtension.exsd [deleted file]
SampleERCP/splash.bmp [deleted file]
SampleERCP/src/net/mograsim/rcp/handlers/AboutHandler.java [deleted file]
SampleERCP/src/net/mograsim/rcp/handlers/OpenHandler.java [deleted file]
SampleERCP/src/net/mograsim/rcp/handlers/QuitHandler.java [deleted file]
SampleERCP/src/net/mograsim/rcp/handlers/SaveHandler.java [deleted file]
SampleERCP/src/net/mograsim/rcp/parts/LogicUIPart.java [deleted file]
SampleERCP/src/net/mograsim/rcp/parts/SamplePart.java [deleted file]
SampleERCP/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java [deleted file]
era.mi/.classpath [deleted file]
era.mi/.gitignore [deleted file]
era.mi/.project [deleted file]
era.mi/.settings/org.eclipse.jdt.core.prefs [deleted file]
era.mi/.settings/org.eclipse.jdt.ui.prefs [deleted file]
era.mi/META-INF/MANIFEST.MF [deleted file]
era.mi/build.properties [deleted file]
era.mi/src/net/mograsim/logic/core/Util.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/BasicComponent.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/BitDisplay.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Clock.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Component.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Connector.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Demux.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/ManualSwitch.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Merger.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Mux.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/Splitter.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/TriStateBuffer.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/gates/AndGate.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/gates/MultiInputGate.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/gates/NotGate.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/gates/OrGate.java [deleted file]
era.mi/src/net/mograsim/logic/core/components/gates/XorGate.java [deleted file]
era.mi/src/net/mograsim/logic/core/tests/ComponentTest.java [deleted file]
era.mi/src/net/mograsim/logic/core/tests/GUITest.java [deleted file]
era.mi/src/net/mograsim/logic/core/tests/TestBitDisplay.java [deleted file]
era.mi/src/net/mograsim/logic/core/timeline/Timeline.java [deleted file]
era.mi/src/net/mograsim/logic/core/timeline/TimelineEvent.java [deleted file]
era.mi/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/Bit.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/BitVector.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/BitVectorFormatter.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/ColorDefinition.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/LogicType.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/MutationOperation.java [deleted file]
era.mi/src/net/mograsim/logic/core/types/StrictLogicType.java [deleted file]
era.mi/src/net/mograsim/logic/core/wires/Wire.java [deleted file]
era.mi/src/net/mograsim/logic/core/wires/WireObserver.java [deleted file]
net.mograsim.logic.core/.classpath [new file with mode: 0644]
net.mograsim.logic.core/.gitignore [new file with mode: 0644]
net.mograsim.logic.core/.project [new file with mode: 0644]
net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
net.mograsim.logic.core/META-INF/MANIFEST.MF [new file with mode: 0644]
net.mograsim.logic.core/build.properties [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/Util.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Clock.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Component.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/AndGate.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/OrGate.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/XorGate.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/GUITest.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/tests/TestBitDisplay.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/ColorDefinition.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java [new file with mode: 0644]
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java [new file with mode: 0644]
net.mograsim.logic.ui/.classpath [new file with mode: 0644]
net.mograsim.logic.ui/.gitignore [new file with mode: 0644]
net.mograsim.logic.ui/.project [new file with mode: 0644]
net.mograsim.logic.ui/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
net.mograsim.logic.ui/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
net.mograsim.logic.ui/META-INF/MANIFEST.MF [new file with mode: 0644]
net.mograsim.logic.ui/build.properties [new file with mode: 0644]
net.mograsim.logic.ui/oldsrc/GUIMerger.java [new file with mode: 0644]
net.mograsim.logic.ui/oldsrc/GUIMux.java [new file with mode: 0644]
net.mograsim.logic.ui/oldsrc/GUISplitter.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/ColorHelper.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicExecuter.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/RSLatchExample.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/ViewModel.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIAndGate.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUINotGate.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIOrGate.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/MovablePin.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/Pin.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java [new file with mode: 0644]
net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java [new file with mode: 0644]
net.mograsim.rcp/.classpath [new file with mode: 0644]
net.mograsim.rcp/.gitignore [new file with mode: 0644]
net.mograsim.rcp/.project [new file with mode: 0644]
net.mograsim.rcp/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
net.mograsim.rcp/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
net.mograsim.rcp/.settings/org.eclipse.ltk.core.refactoring.prefs [new file with mode: 0644]
net.mograsim.rcp/.settings/org.eclipse.pde.prefs [new file with mode: 0644]
net.mograsim.rcp/.settings/org.eclipse.wst.sse.core.prefs [new file with mode: 0644]
net.mograsim.rcp/.settings/org.sonarlint.eclipse.core.prefs [new file with mode: 0644]
net.mograsim.rcp/Application.e4xmi [new file with mode: 0644]
net.mograsim.rcp/LICENSE [new file with mode: 0644]
net.mograsim.rcp/META-INF/MANIFEST.MF [new file with mode: 0644]
net.mograsim.rcp/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
net.mograsim.rcp/build.properties [new file with mode: 0644]
net.mograsim.rcp/css/default.css [new file with mode: 0644]
net.mograsim.rcp/icons/af.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_128t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_16t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_24t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_256t.icns [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_256t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_256t.xpm [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_32t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_48t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_64t.png [new file with mode: 0644]
net.mograsim.rcp/icons/app/ico_all.ico [new file with mode: 0644]
net.mograsim.rcp/icons/embedded.png [new file with mode: 0644]
net.mograsim.rcp/icons/enterprise.png [new file with mode: 0644]
net.mograsim.rcp/icons/home.png [new file with mode: 0644]
net.mograsim.rcp/icons/languages.png [new file with mode: 0644]
net.mograsim.rcp/icons/open_in_app.png [new file with mode: 0644]
net.mograsim.rcp/icons/rcp.png [new file with mode: 0644]
net.mograsim.rcp/icons/save_edit.png [new file with mode: 0644]
net.mograsim.rcp/net.mograsim.rcp.product [new file with mode: 0644]
net.mograsim.rcp/plugin.xml [new file with mode: 0644]
net.mograsim.rcp/schema/splashExtension.exsd [new file with mode: 0644]
net.mograsim.rcp/splash.bmp [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/handlers/AboutHandler.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/handlers/OpenHandler.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/handlers/QuitHandler.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/handlers/SaveHandler.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/parts/LogicUIPart.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/parts/SamplePart.java [new file with mode: 0644]
net.mograsim.rcp/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java [new file with mode: 0644]

diff --git a/LogicUI/.classpath b/LogicUI/.classpath
deleted file mode 100644 (file)
index bde0882..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
-               <attributes>
-                       <attribute name="module" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/LogicUI/.gitignore b/LogicUI/.gitignore
deleted file mode 100644 (file)
index ae3c172..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/LogicUI/.project b/LogicUI/.project
deleted file mode 100644 (file)
index 8ce0afd..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>net.mograsim.logic.ui</name>
-       <comment></comment>
-       <projects>
-               <project>net.mograsim.logic.core</project>
-               <project>SWTZoomableCanvas</project>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-               <nature>org.eclipse.pde.PluginNature</nature>
-       </natures>
-</projectDescription>
diff --git a/LogicUI/.settings/org.eclipse.jdt.core.prefs b/LogicUI/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index 2196a4a..0000000
+++ /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=10
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=10
-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=10
-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/LogicUI/.settings/org.eclipse.jdt.ui.prefs b/LogicUI/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644 (file)
index 8f2c0a4..0000000
+++ /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/LogicUI/META-INF/MANIFEST.MF b/LogicUI/META-INF/MANIFEST.MF
deleted file mode 100644 (file)
index 24a1c9a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: net.mograsim.logic.ui
-Bundle-SymbolicName: net.mograsim.logic.ui;singleton:=true
-Bundle-Version: 1.0.0
-Export-Package: net.mograsim.logic.ui,
- net.mograsim.logic.ui.examples,
- net.mograsim.logic.ui.model,
- net.mograsim.logic.ui.model.components,
- net.mograsim.logic.ui.model.wires,
- net.mograsim.logic.ui.modeladapter,
- net.mograsim.logic.ui.modeladapter.componentadapters
-Bundle-RequiredExecutionEnvironment: JavaSE-10
-Require-Bundle: org.eclipse.swt;bundle-version="3.110.0",
- SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport,
- net.mograsim.logic.core;bundle-version="1.0.0";visibility:=reexport
-Automatic-Module-Name: net.mograsim.logic.ui
diff --git a/LogicUI/build.properties b/LogicUI/build.properties
deleted file mode 100644 (file)
index b107977..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-source.. = src/
-bin.includes = META-INF/,\
-               .
diff --git a/LogicUI/oldsrc/GUIMerger.java b/LogicUI/oldsrc/GUIMerger.java
deleted file mode 100644 (file)
index 64fd0aa..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.components.Merger;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUIMerger extends Merger implements GUIComponent
-{
-       private final int inputCount;
-       private final double height;
-       private final List<ReadEnd> connectedWireEnds;
-       private final List<Point> WireEndConnectionPoints;
-
-       public GUIMerger(ReadWriteEnd union, ReadEnd... inputs)
-       {
-               super(union, inputs);
-
-               List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
-               List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
-
-               this.inputCount = inputs.length;
-               this.height = (inputCount - 1) * 10;
-
-               {
-                       connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
-                       double inputHeight = 0;
-                       for (int i = 0; i < inputCount; i++, inputHeight += 10)
-                               WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
-               }
-
-               connectedWireEndsModifiable.add(union);
-               WireEndConnectionPointsModifiable.add(new Point(20, height / 2));
-
-               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
-               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
-       }
-
-       @Override
-       public Rectangle getBounds()
-       {
-               return new Rectangle(0, 0, 20, height);
-       }
-
-       @Override
-       public void render(GeneralGC gc)
-       {
-               double inputHeight = 0;
-               for (int i = 0; i < inputCount; i++, inputHeight += 10)
-                       gc.drawLine(0, inputHeight, 10, inputHeight);
-               gc.drawLine(10, 0, 10, height);
-               gc.drawLine(10, height / 2, 20, height / 2);
-       }
-
-       @Override
-       public int getConnectedWireEndsCount()
-       {
-               return connectedWireEnds.size();
-       }
-
-       @Override
-       public ReadEnd getConnectedWireEnd(int connectionIndex)
-       {
-               return connectedWireEnds.get(connectionIndex);
-       }
-
-       @Override
-       public Point getWireEndConnectionPoint(int connectionI)
-       {
-               return WireEndConnectionPoints.get(connectionI);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/oldsrc/GUIMux.java b/LogicUI/oldsrc/GUIMux.java
deleted file mode 100644 (file)
index d004d90..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.components.Mux;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUIMux extends Mux implements GUIComponent
-{
-       private final double height;
-       private final List<ReadEnd> connectedWireEnds;
-       private final List<Point> WireEndConnectionPoints;
-
-       public GUIMux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
-       {
-               super(processTime, out, select, inputs);
-
-               double height = inputs.length * 5;
-               if (height < 10)
-                       height = 10;
-               this.height = height;
-
-               List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
-               List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
-
-               connectedWireEndsModifiable.add(out);
-               WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));
-
-               connectedWireEndsModifiable.add(select);
-               WireEndConnectionPointsModifiable.add(new Point(10, 5));
-
-               {
-                       connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
-                       double inputHeightIncrement = (height + 20) / inputs.length;
-                       double inputHeight = inputHeightIncrement / 2;
-                       for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)
-                               WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
-               }
-
-               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
-               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
-       }
-
-       @Override
-       public Rectangle getBounds()
-       {
-               return new Rectangle(0, 0, 20, height + 20);
-       }
-
-       @Override
-       public void render(GeneralGC gc)
-       {
-               gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });
-       }
-
-       @Override
-       public int getConnectedWireEndsCount()
-       {
-               return connectedWireEnds.size();
-       }
-
-       @Override
-       public ReadEnd getConnectedWireEnd(int connectionIndex)
-       {
-               return connectedWireEnds.get(connectionIndex);
-       }
-
-       @Override
-       public Point getWireEndConnectionPoint(int connectionI)
-       {
-               return WireEndConnectionPoints.get(connectionI);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/oldsrc/GUISplitter.java b/LogicUI/oldsrc/GUISplitter.java
deleted file mode 100644 (file)
index 1bff424..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.gui.ViewModel;
-import era.mi.logic.components.Splitter;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUISplitter extends GUIComponent
-{
-       public GUISplitter(ViewModel model)
-       {
-               super(model);
-
-               this.outputCount = outputs.length;
-               this.height = (outputCount - 1) * 10;
-
-               connectedWireEndsModifiable.add(input);
-               WireEndConnectionPointsModifiable.add(new Point(0, height / 2));
-
-               {
-                       connectedWireEndsModifiable.addAll(Arrays.asList(outputs));
-                       double outputHeight = 0;
-                       for (int i = 0; i < outputCount; i++, outputHeight += 10)
-                               WireEndConnectionPointsModifiable.add(new Point(20, outputHeight));
-               }
-
-               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
-               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
-       }
-
-       @Override
-       public Rectangle getBounds()
-       {
-               return new Rectangle(0, 0, 20, height);
-       }
-
-       @Override
-       public void render(GeneralGC gc)
-       {
-               gc.drawLine(0, height / 2, 10, height / 2);
-               gc.drawLine(10, 0, 10, height);
-               double outputHeight = 0;
-               for (int i = 0; i < outputCount; i++, outputHeight += 10)
-                       gc.drawLine(10, outputHeight, 20, outputHeight);
-       }
-
-       @Override
-       public int getConnectedWireEndsCount()
-       {
-               return connectedWireEnds.size();
-       }
-
-       @Override
-       public ReadEnd getConnectedWireEnd(int connectionIndex)
-       {
-               return connectedWireEnds.get(connectionIndex);
-       }
-
-       @Override
-       public Point getWireEndConnectionPoint(int connectionI)
-       {
-               return WireEndConnectionPoints.get(connectionI);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/ColorHelper.java b/LogicUI/src/net/mograsim/logic/ui/ColorHelper.java
deleted file mode 100644 (file)
index b631507..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.mograsim.logic.core.types.ColorDefinition;
-import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
-
-//TODO replace with a proper ColorManager
-public class ColorHelper
-{
-       public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
-       {
-               executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
-       }
-
-       public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
-       {
-               executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
-       }
-
-       private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
-                       Runnable exec)
-       {
-               Color oldColor = getColor.get();
-               boolean isNoSystemColor = col.builtInColor == null;
-               Color newColor;
-               if (isNoSystemColor)
-                       newColor = new Color(device, col.r, col.g, col.b);
-               else
-                       newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
-               setColor.accept(newColor);
-
-               exec.run();
-
-               setColor.accept(oldColor);
-               if (isNoSystemColor)
-                       newColor.dispose();
-       }
-
-       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);
-               }
-       }
-
-       private ColorHelper()
-       {
-               throw new UnsupportedOperationException("No instances of ColorHelper");
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/LogicExecuter.java b/LogicUI/src/net/mograsim/logic/ui/LogicExecuter.java
deleted file mode 100644 (file)
index fadfbe9..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-package net.mograsim.logic.ui;
-
-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 LogicModel 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();
-                       }
-                       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
-                               }
-                       }
-                       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/LogicUI/src/net/mograsim/logic/ui/LogicUICanvas.java b/LogicUI/src/net/mograsim/logic/ui/LogicUICanvas.java
deleted file mode 100644 (file)
index 3a08097..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-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.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.Pin;
-
-/**
- * Simulation visualizer canvas.
- * 
- * @author Daniel Kirschten
- */
-public class LogicUICanvas extends ZoomableCanvas
-{
-       private static final boolean DRAW_PINS = false;
-
-       private final ViewModel model;
-
-       public LogicUICanvas(Composite parent, int style, ViewModel model)
-       {
-               super(parent, style);
-
-               this.model = model;
-
-               Consumer<Object> redrawConsumer = o -> redrawThreadsafe();
-               Consumer<Pin> pinAddedListener = p ->
-               {
-                       p.addPinMovedListener(redrawConsumer);
-                       redrawThreadsafe();
-               };
-               Consumer<Pin> pinRemovedListener = p ->
-               {
-                       p.removePinMovedListener(redrawConsumer);
-                       redrawThreadsafe();
-               };
-               Consumer<? super GUIComponent> componentAddedListener = c ->
-               {
-                       c.addComponentLookChangedListener(redrawConsumer);
-                       c.addComponentMovedListener(redrawConsumer);
-                       c.addPinAddedListener(pinAddedListener);
-                       c.addPinRemovedListener(pinRemovedListener);
-                       redrawThreadsafe();
-               };
-               model.addComponentAddedListener(componentAddedListener);
-               model.getComponents().forEach(componentAddedListener);
-               model.addComponentRemovedListener(c ->
-               {
-                       c.removeComponentLookChangedListener(redrawConsumer);
-                       c.removeComponentMovedListener(redrawConsumer);
-                       c.removePinAddedListener(pinAddedListener);
-                       c.removePinRemovedListener(pinRemovedListener);
-                       redrawThreadsafe();
-               });
-               Consumer<? super GUIWire> wireAddedListener = w ->
-               {
-                       w.addWireLookChangedListener(redrawConsumer);
-                       redrawThreadsafe();
-               };
-               model.addWireAddedListener(wireAddedListener);
-               model.getWires().forEach(wireAddedListener);
-               model.addWireRemovedListener(w ->
-               {
-                       w.removeWireLookChangedListener(redrawConsumer);
-                       redrawThreadsafe();
-               });
-
-               addZoomedRenderer(gc ->
-               {
-                       gc.setLineWidth(.5);
-                       model.getWires().forEach(w -> w.render(gc));
-                       Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);
-                       model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));
-               });
-               addListener(SWT.MouseDown, this::mouseDown);
-       }
-
-       private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)
-       {
-               component.render(gc, visibleRegion);
-               if (DRAW_PINS)
-               {
-                       gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_CYAN));
-                       for (Pin p : component.getPins())
-                       {
-                               Point pos = p.getPos();
-                               gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);
-                       }
-               }
-       }
-
-       private void mouseDown(Event e)
-       {
-               if (e.button == 1)
-               {
-                       Point click = displayToWorldCoords(e.x, e.y);
-                       for (GUIComponent component : model.getComponents())
-                               if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
-                               {
-                                       redraw();
-                                       break;
-                               }
-               }
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java b/LogicUI/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java
deleted file mode 100644 (file)
index 64b442e..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-package net.mograsim.logic.ui;
-
-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.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-
-/**
- * Standalone simulation visualizer graphical user interface.
- * 
- * @author Daniel Kirschten
- */
-public class LogicUIStandaloneGUI
-{
-       private final Display display;
-       private final Shell shell;
-       private final LogicUICanvas ui;
-
-       public LogicUIStandaloneGUI(ViewModel 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();
-
-               // TODO don't do this here
-               LogicModelParameters params = new LogicModelParameters();
-               params.gateProcessTime = 50;
-               params.wireTravelTime = 10;
-//             timeline = ViewLogicModelAdapter.convert(model, params);
-       }
-
-       public LogicUICanvas getLogicUICanvas()
-       {
-               return ui;
-       }
-
-       /**
-        * Opens the UI shell. Returns when the shell is closed.
-        */
-       public void run()
-       {
-               shell.open();
-               while (!shell.isDisposed())
-                       if (!display.readAndDispatch())
-                               display.sleep();
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java b/LogicUI/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java
deleted file mode 100644 (file)
index aa1dd57..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
-
-public class SimpleLogicUIStandalone
-{
-       public static void executeVisualisation(Consumer<ViewModel> setupViewModel)
-       {
-               // setup view model
-               ViewModel viewModel = new ViewModel();
-               setupViewModel.accept(viewModel);
-
-               // convert to logic model
-               LogicModelParameters params = new LogicModelParameters();
-               params.gateProcessTime = 50;
-               params.wireTravelTime = 10;
-               Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
-
-               // initialize UI and executer
-               LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(viewModel);
-               LogicExecuter exec = new LogicExecuter(timeline);
-
-               // run it
-               exec.startLiveExecution();
-               ui.run();
-               exec.stopLiveExecution();
-       }
-
-       private SimpleLogicUIStandalone()
-       {
-               throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances");
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/examples/RSLatchExample.java b/LogicUI/src/net/mograsim/logic/ui/examples/RSLatchExample.java
deleted file mode 100644 (file)
index af91d1f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.mograsim.logic.ui.examples;
-
-import net.mograsim.logic.ui.SimpleLogicUIStandalone;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIManualSwitch;
-import net.mograsim.logic.ui.model.components.GUINotGate;
-import net.mograsim.logic.ui.model.components.GUIOrGate;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.WireCrossPoint;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-
-public class RSLatchExample
-{
-       public static void main(String[] args)
-       {
-               SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample);
-       }
-
-       @SuppressWarnings("unused") // for GUIWires being created
-       public static void createRSLatchExample(ViewModel model)
-       {
-               GUIManualSwitch rIn = new GUIManualSwitch(model);
-               rIn.moveTo(100, 100);
-               GUIManualSwitch sIn = new GUIManualSwitch(model);
-               sIn.moveTo(100, 200);
-
-               GUIOrGate or1 = new GUIOrGate(model, 1);
-               or1.moveTo(160, 102.5);
-               new GUIWire(model, rIn.getOutputPin(), or1.getInputPins().get(0));
-
-               GUIOrGate or2 = new GUIOrGate(model, 1);
-               or2.moveTo(160, 192.5);
-               new GUIWire(model, sIn.getOutputPin(), or2.getInputPins().get(1));
-
-               GUINotGate not1 = new GUINotGate(model, 1);
-               not1.moveTo(200, 107.5);
-               new GUIWire(model, or1.getOutputPin(), not1.getInputPins().get(0));
-
-               GUINotGate not2 = new GUINotGate(model, 1);
-               not2.moveTo(200, 197.5);
-               new GUIWire(model, or2.getOutputPin(), not2.getInputPins().get(0));
-
-               WireCrossPoint p1 = new WireCrossPoint(model, 1);
-               p1.moveTo(250, 112.5);
-               new GUIWire(model, not1.getOutputPin(), p1.getPin());
-               new GUIWire(model, p1.getPin(), or2.getInputPins().get(0), new Point(250, 130), new Point(140, 185), new Point(140, 197.5));
-
-               WireCrossPoint p2 = new WireCrossPoint(model, 1);
-               p2.moveTo(250, 202.5);
-               new GUIWire(model, not2.getOutputPin(), p2.getPin());
-               new GUIWire(model, p2.getPin(), or1.getInputPins().get(1), new Point(250, 185), new Point(140, 130), new Point(140, 117.5));
-
-               WireCrossPoint o1 = new WireCrossPoint(model, 1);
-               o1.moveTo(270, 112.5);
-               new GUIWire(model, p1.getPin(), o1.getPin());
-
-               WireCrossPoint o2 = new WireCrossPoint(model, 1);
-               o2.moveTo(270, 202.5);
-               new GUIWire(model, p2.getPin(), o2.getPin());
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/ViewModel.java b/LogicUI/src/net/mograsim/logic/ui/model/ViewModel.java
deleted file mode 100644 (file)
index 717ee13..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.mograsim.logic.ui.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-
-public class ViewModel
-{
-       private final List<GUIComponent> components;
-       private final List<GUIComponent> componentsUnmodifiable;
-       private final List<GUIWire> wires;
-       private final List<GUIWire> wiresUnmodifiable;
-
-       private final List<Consumer<? super GUIComponent>> componentAddedListeners;
-       private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
-       private final List<Consumer<? super GUIWire>> wireAddedListeners;
-       private final List<Consumer<? super GUIWire>> wireRemovedListeners;
-
-       public ViewModel()
-       {
-               components = new ArrayList<>();
-               componentsUnmodifiable = Collections.unmodifiableList(components);
-               wires = new ArrayList<>();
-               wiresUnmodifiable = Collections.unmodifiableList(wires);
-
-               componentAddedListeners = new ArrayList<>();
-               componentRemovedListeners = new ArrayList<>();
-               wireAddedListeners = new ArrayList<>();
-               wireRemovedListeners = 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 GUIComponent::new.
-        */
-       public void componentCreated(GUIComponent component)
-       {
-               if (components.contains(component))
-                       throw new IllegalStateException("Don't add the same component twice!");
-               components.add(component);
-               callComponentAddedListeners(component);
-       }
-
-       /**
-        * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
-        * application code as it is automatically called in GUIComponent::destroy.
-        */
-       public void componentDestroyed(GUIComponent component)
-       {
-               if (!components.contains(component))
-                       throw new IllegalStateException("Don't remove the same component twice!");
-               components.remove(component);
-               callComponentRemovedListeners(component);
-       }
-
-       /**
-        * 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 GUIComponent::new.
-        */
-       public void wireCreated(GUIWire wire)
-       {
-               if (wires.contains(wire))
-                       throw new IllegalStateException("Don't add the same wire twice!");
-               wires.add(wire);
-               callWireAddedListeners(wire);
-       }
-
-       /**
-        * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
-        * application code as it is automatically called in GUIComponent::destroy.
-        */
-       public void wireDestroyed(GUIWire wire)
-       {
-               if (!wires.contains(wire))
-                       throw new IllegalStateException("Don't remove the same wire twice!");
-               wires.remove(wire);
-               callWireRemovedListeners(wire);
-       }
-
-       public List<GUIComponent> getComponents()
-       {
-               return componentsUnmodifiable;
-       }
-
-       public List<GUIWire> getWires()
-       {
-               return wiresUnmodifiable;
-       }
-
-       // @formatter:off
-       public void addComponentAddedListener     (Consumer<? super GUIComponent> listener){componentAddedListeners  .add   (listener);}
-       public void addComponentRemovedListener   (Consumer<? super GUIComponent> listener){componentRemovedListeners.add   (listener);}
-       public void addWireAddedListener          (Consumer<? super GUIWire     > listener){wireAddedListeners       .add   (listener);}
-       public void addWireRemovedListener        (Consumer<? super GUIWire     > listener){wireRemovedListeners     .add   (listener);}
-
-       public void removeComponentAddedListener  (Consumer<? super GUIComponent> listener){componentAddedListeners  .remove(listener);}
-       public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener){componentRemovedListeners.remove(listener);}
-       public void removeWireAddedListener       (Consumer<? super GUIWire     > listener){wireAddedListeners       .remove(listener);}
-       public void removeWireRemovedListener     (Consumer<? super GUIWire     > listener){wireRemovedListeners     .remove(listener);}
-
-       private void callComponentAddedListeners  (GUIComponent c) {componentAddedListeners  .forEach(l -> l.accept(c));}
-       private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));}
-       private void callWireAddedListeners       (GUIWire w     ) {wireAddedListeners       .forEach(l -> l.accept(w));}
-       private void callWireRemovedListeners     (GUIWire w     ) {wireRemovedListeners     .forEach(l -> l.accept(w));}
-       // @formatter:on
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUIAndGate.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUIAndGate.java
deleted file mode 100644 (file)
index 440881d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUIAndGate extends SimpleRectangularGUIGate
-{
-       public GUIAndGate(ViewModel model, int logicWidth)
-       {
-               super(model, logicWidth, "&", false);
-               setInputCount(2);// TODO make variable
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUIComponent.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUIComponent.java
deleted file mode 100644 (file)
index 9cea86a..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public abstract class GUIComponent
-{
-       protected final ViewModel model;
-       private final Rectangle bounds;
-       private final List<Pin> pins;
-       protected final List<Pin> pinsUnmodifiable;
-
-       private final List<Consumer<? super GUIComponent>> componentLookChangedListeners;
-       private final List<Consumer<? super GUIComponent>> componentMovedListeners;
-       private final List<Consumer<? super Pin>> pinAddedListeners;
-       private final List<Consumer<? super Pin>> pinRemovedListeners;
-
-       public GUIComponent(ViewModel model)
-       {
-               this.model = model;
-               this.bounds = new Rectangle(0, 0, 0, 0);
-               this.pins = new ArrayList<>();
-               this.pinsUnmodifiable = Collections.unmodifiableList(pins);
-
-               this.componentLookChangedListeners = new ArrayList<>();
-               this.componentMovedListeners = new ArrayList<>();
-               this.pinAddedListeners = new ArrayList<>();
-               this.pinRemovedListeners = new ArrayList<>();
-
-               model.componentCreated(this);
-       }
-
-       public void destroy()
-       {
-               pins.forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
-               model.componentDestroyed(this);
-       }
-
-       public void moveTo(double x, double y)
-       {
-               bounds.x = x;
-               bounds.y = y;
-               callComponentMovedListeners();
-       }
-
-       /**
-        * Returns the bounds of this component. Used for calculating which component is clicked.
-        */
-       public Rectangle getBounds()
-       {
-               return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
-       }
-
-       /**
-        * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this
-        * click.
-        */
-       @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden
-       public boolean clicked(double x, double y)
-       {
-               return false;
-       }
-
-       /**
-        * Returns a list of pins of this component.
-        */
-       public List<Pin> getPins()
-       {
-               return pinsUnmodifiable;
-       }
-
-       // @formatter:off
-       public void addComponentLookChangedListener   (Consumer<? super GUIComponent> listener) {componentLookChangedListeners.add   (listener);}
-       public void addComponentMovedListener         (Consumer<? super GUIComponent> listener) {componentMovedListeners      .add   (listener);}
-       public void addPinAddedListener               (Consumer<? super Pin         > listener) {pinAddedListeners            .add   (listener);}
-       public void addPinRemovedListener             (Consumer<? super Pin         > listener) {pinRemovedListeners          .add   (listener);}
-                                                  
-       public void removeComponentLookChangedListener(Consumer<? super GUIComponent> listener) {componentLookChangedListeners.remove(listener);}
-       public void removeComponentMovedListener      (Consumer<? super GUIComponent> listener) {componentMovedListeners      .remove(listener);}
-       public void removePinAddedListener            (Consumer<? super Pin         > listener) {pinAddedListeners            .remove(listener);}
-       public void removePinRemovedListener          (Consumer<? super Pin         > listener) {pinRemovedListeners          .remove(listener);}
-
-       protected void callComponentLookChangedListeners(     ) {componentLookChangedListeners.forEach(l -> l.accept(this));}
-       private   void callComponentMovedListeners      (     ) {componentMovedListeners      .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   ));}
-       // @form  atter:on
-
-       /**
-        * Render this component to the given gc.
-        */
-       public abstract void render(GeneralGC gc, Rectangle visibleRegion);
-
-       protected void setSize(double width, double height)
-       {
-               bounds.width = width;
-               bounds.height = height;
-               callComponentLookChangedListeners();
-       }
-
-       protected void addPin(Pin pin)
-       {
-               pins.add(pin);
-               callPinAddedListeners(pin);
-       }
-
-       protected void removePin(Pin pin)
-       {
-               pins.remove(pin);
-               callPinRemovedListeners(pin);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java
deleted file mode 100644 (file)
index 8ca57ee..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.Pin;
-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.components.ManualSwitch;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class GUIManualSwitch extends GUIComponent
-{
-       private static final double width = 20;
-       private static final double height = 15;
-       private static final double fontHeight = 5;
-
-       private final Pin outputPin;
-
-       private ManualSwitch logicSwitch;
-       private ReadEnd end;
-
-       public GUIManualSwitch(ViewModel model)
-       {
-               super(model);
-               setSize(width, height);
-               addPin(this.outputPin = new Pin(this, 1, width, height / 2));
-       }
-
-       @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
-       {
-               double posX = getBounds().x;
-               double posY = getBounds().y;
-
-               gc.drawRectangle(posX, posY, width, height);
-               String label = BitVectorFormatter.formatValueAsString(end);
-               Font oldFont = gc.getFont();
-               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
-               gc.setFont(labelFont);
-               Point textExtent = gc.textExtent(label);
-               gc.drawText(label, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
-               gc.setFont(oldFont);
-       }
-
-       public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
-       {
-               this.logicSwitch = logicSwitch;
-               this.end = end;
-               // TODO when ManualSwitch supports it, add listeners
-               end.addObserver((i, o) -> callComponentLookChangedListeners());
-       }
-
-       @Override
-       public boolean clicked(double x, double y)
-       {
-               if (logicSwitch != null)
-                       logicSwitch.toggle();
-               return true;
-       }
-
-       public Pin getOutputPin()
-       {
-               return outputPin;
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUINotGate.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUINotGate.java
deleted file mode 100644 (file)
index 01df349..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUINotGate extends SimpleRectangularGUIGate
-{
-       public GUINotGate(ViewModel model, int logicWidth)
-       {
-               super(model, logicWidth, "1", true);
-               setInputCount(1);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUIOrGate.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUIOrGate.java
deleted file mode 100644 (file)
index bbc436d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUIOrGate extends SimpleRectangularGUIGate
-{
-       public GUIOrGate(ViewModel model, int logicWidth)
-       {
-               super(model, logicWidth, "\u22651", false);// ">=1"
-               setInputCount(2);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java b/LogicUI/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java
deleted file mode 100644 (file)
index a2875c6..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-package net.mograsim.logic.ui.model.components;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.MovablePin;
-import net.mograsim.logic.ui.model.wires.Pin;
-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;
-
-public class SimpleRectangularGUIGate extends GUIComponent
-{
-       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 label;
-       protected final int logicWidth;
-       private final boolean isInverted;
-       private final double rectWidth;
-
-       private MovablePin outputPin;
-       private final List<Pin> inputPins;
-       private final List<Pin> inputPinsUnmodifiable;
-
-       protected SimpleRectangularGUIGate(ViewModel model, int logicWidth, String label, boolean isInverted)
-       {
-               super(model);
-               this.label = label;
-               this.logicWidth = logicWidth;
-               this.isInverted = isInverted;
-               this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
-               this.outputPin = new MovablePin(this, logicWidth, width, 0);
-               addPin(outputPin);
-               this.inputPins = new ArrayList<>();
-               this.inputPinsUnmodifiable = Collections.unmodifiableList(inputPins);
-               setInputCount(1);
-       }
-
-       protected void setInputCount(int inputCount)
-       {
-               int oldInputCount = inputPins.size();
-               setSize(width, inputCount * pinDistance);
-               if (oldInputCount > inputCount)
-                       while (inputPins.size() > inputCount)
-                               removePin(inputPins.get(inputCount));
-               else if (oldInputCount < inputCount)
-                       for (int i = oldInputCount; i < inputCount; i++)
-                       {
-                               Pin pin = new Pin(this, logicWidth, 0, pinDistance / 2 + i * pinDistance);
-                               inputPins.add(pin);
-                               addPin(pin);
-                       }
-               outputPin.setRelPos(width, inputCount * pinDistance / 2);
-       }
-
-       public Pin getOutputPin()
-       {
-               return outputPin;
-       }
-
-       public List<Pin> getInputPins()
-       {
-               return inputPinsUnmodifiable;
-       }
-
-       @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
-       {
-               double posX = getBounds().x;
-               double posY = getBounds().y;
-
-               double height = inputPins.size() * pinDistance;
-               gc.drawRectangle(posX, posY, rectWidth, height);
-               Font oldFont = gc.getFont();
-               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
-               gc.setFont(labelFont);
-               Point textExtent = gc.textExtent(label);
-               gc.drawText(label, posX + (rectWidth - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
-               gc.setFont(oldFont);
-               if (isInverted)
-                       gc.drawOval(posX + rectWidth, posY + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/wires/GUIWire.java b/LogicUI/src/net/mograsim/logic/ui/model/wires/GUIWire.java
deleted file mode 100644 (file)
index 736c0ea..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-package net.mograsim.logic.ui.model.wires;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.ColorHelper;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class GUIWire
-{
-       private final ViewModel model;
-       public final int logicWidth;
-       private Pin pin1;
-       private Pin pin2;
-       private double[] path;
-
-       private final List<Consumer<? super GUIWire>> wireLookChangedListeners;
-
-       private ReadEnd end;
-
-       public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
-       {
-               this.model = model;
-               this.logicWidth = pin1.logicWidth;
-               if (pin2.logicWidth != pin1.logicWidth)
-                       throw new IllegalArgumentException("Can't connect pins of different logic width");
-               this.path = new double[path.length * 2 + 4];
-               for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)
-               {
-                       this.path[dstI + 0] = path[srcI].x;
-                       this.path[dstI + 1] = path[srcI].y;
-               }
-
-               this.pin1 = pin1;
-               this.pin2 = pin2;
-
-               wireLookChangedListeners = new ArrayList<>();
-
-               pin1.addPinMovedListener(p -> pin1Moved());
-               pin2.addPinMovedListener(p -> pin2Moved());
-               pin1Moved();
-               pin2Moved();
-
-               model.wireCreated(this);
-       }
-
-       private void pin1Moved()
-       {
-               Point pos = pin1.getPos();
-               this.path[0] = pos.x;
-               this.path[1] = pos.y;
-       }
-
-       private void pin2Moved()
-       {
-               Point pos = pin2.getPos();
-               this.path[this.path.length - 2] = pos.x;
-               this.path[this.path.length - 1] = pos.y;
-       }
-
-       public void destroy()
-       {
-               model.wireDestroyed(this);
-       }
-
-       public void render(GeneralGC gc)
-       {
-               ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
-       }
-
-       public void setLogicModelBinding(ReadEnd end)
-       {
-               this.end = end;
-               end.addObserver((i, o) -> callWireLookChangedListeners());
-       }
-
-       public Pin getPin1()
-       {
-               return pin1;
-       }
-
-       public Pin getPin2()
-       {
-               return pin2;
-       }
-
-       // @formatter:off
-       public void addWireLookChangedListener   (Consumer<? super GUIWire> listener) {wireLookChangedListeners.add   (listener);}
-
-       public void removeWireLookChangedListener(Consumer<? super GUIWire> listener) {wireLookChangedListeners.remove(listener);}
-
-       private void callWireLookChangedListeners() {wireLookChangedListeners.forEach(l -> l.accept(this));}
-       // @formatter:on
-
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/wires/MovablePin.java b/LogicUI/src/net/mograsim/logic/ui/model/wires/MovablePin.java
deleted file mode 100644 (file)
index 669bb1b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.mograsim.logic.ui.model.wires;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-
-public class MovablePin extends Pin
-{
-       public MovablePin(GUIComponent component, int logicWidth, double relX, double relY)
-       {
-               super(component, logicWidth, relX, relY);
-       }
-
-       @Override
-       public void setRelPos(double relX, double relY)
-       {
-               super.setRelPos(relX, relY);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/wires/Pin.java b/LogicUI/src/net/mograsim/logic/ui/model/wires/Pin.java
deleted file mode 100644 (file)
index f3a7802..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-package net.mograsim.logic.ui.model.wires;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class Pin
-{
-       public final GUIComponent component;
-       public final int logicWidth;
-
-       protected double relX;
-       protected double relY;
-
-       private final List<Consumer<? super Pin>> pinMovedListeners;
-
-       public Pin(GUIComponent component, int logicWidth, double relX, double relY)
-       {
-               this.component = component;
-               this.logicWidth = logicWidth;
-               this.relX = relX;
-               this.relY = relY;
-
-               this.pinMovedListeners = new ArrayList<>();
-
-               component.addComponentMovedListener(c -> callPinMovedListeners());
-       }
-
-       public double getRelX()
-       {
-               return relX;
-       }
-
-       public double getRelY()
-       {
-               return relY;
-       }
-
-       public Point getRelPos()
-       {
-               return new Point(relX, relY);
-       }
-
-       public Point getPos()
-       {
-               Rectangle componentBounds = component.getBounds();
-               return new Point(relX + componentBounds.x, relY + componentBounds.y);
-       }
-
-       // @formatter:off
-       public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
-
-       public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
-
-       private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
-       // @formatter:on
-
-       protected void setRelPos(double relX, double relY)
-       {
-               this.relX = relX;
-               this.relY = relY;
-               callPinMovedListeners();
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java b/LogicUI/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java
deleted file mode 100644 (file)
index 0949ffb..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package net.mograsim.logic.ui.model.wires;
-
-import net.mograsim.logic.ui.ColorHelper;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-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.Wire.ReadEnd;
-
-public class WireCrossPoint extends GUIComponent
-{
-       private final Pin pin;
-
-       private ReadEnd end;
-       private final int logicWidth;
-
-       public WireCrossPoint(ViewModel model, int logicWidth)
-       {
-               super(model);
-               this.logicWidth = logicWidth;
-               setSize(0, 0);
-               addPin(this.pin = new Pin(this, logicWidth, 0, 0));
-       }
-
-       @Override
-       public void render(GeneralGC gc, Rectangle visibleRegion)
-       {
-               Rectangle bounds = getBounds();
-               ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
-                               () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
-       }
-
-       public void setLogicModelBinding(ReadEnd end)
-       {
-               this.end = end;
-               end.addObserver((i, o) -> callComponentLookChangedListeners());
-       }
-
-       public int getLogicWidth()
-       {
-               return logicWidth;
-       }
-
-       public Pin getPin()
-       {
-               return pin;
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java b/LogicUI/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java
deleted file mode 100644 (file)
index d75cb1b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package net.mograsim.logic.ui.modeladapter;
-
-public class LogicModelParameters
-{
-       public int wireTravelTime;
-       public int gateProcessTime;
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java b/LogicUI/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java
deleted file mode 100644 (file)
index 6f4e7b7..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-package net.mograsim.logic.ui.modeladapter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-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.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIAndGate;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.components.GUINotGate;
-import net.mograsim.logic.ui.model.components.GUIOrGate;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.model.wires.WireCrossPoint;
-import net.mograsim.logic.ui.modeladapter.componentadapters.ComponentAdapter;
-import net.mograsim.logic.ui.modeladapter.componentadapters.ManualSwitchAdapter;
-import net.mograsim.logic.ui.modeladapter.componentadapters.SimpleGateAdapter;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.components.gates.AndGate;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class ViewLogicModelAdapter
-{
-       private final static Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdapters;
-       static
-       {
-               Set<ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashSet<>();
-               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new));
-               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new));
-               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o)));
-               componentAdaptersModifiable.add(new ManualSwitchAdapter());
-               // TODO list all "primitive" adapters here
-               componentAdapters = Collections.unmodifiableMap(
-                               componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity())));
-       }
-
-       public static Timeline convert(ViewModel viewModel, LogicModelParameters params)
-       {
-               // TODO replace Timeline with LogicModel as soon as it exists
-               Timeline timeline = new Timeline(10);
-
-               Map<Pin, Wire> logicWiresPerPin = convertWires(
-                               viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()),
-                               viewModel.getWires(), params, timeline);
-               Map<Pin, Wire> logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin);
-
-               Map<GUIComponent, Component> oneToOneComponents = new HashMap<>();
-               for (GUIComponent guiComp : viewModel.getComponents())
-               {
-                       if (!(guiComp instanceof WireCrossPoint))
-                               oneToOneComponents.put(guiComp, createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable,
-                                               componentAdapters.get(guiComp.getClass())));
-                       else
-                       {
-                               WireCrossPoint guiCompCasted = (WireCrossPoint) guiComp;
-                               guiCompCasted.setLogicModelBinding(logicWiresPerPin.get(guiCompCasted.getPin()).createReadOnlyEnd());
-                       }
-               }
-
-               // TODO handle complex components
-
-               List<Component> logicComponents = new ArrayList<>();
-               logicComponents.addAll(oneToOneComponents.values());
-
-               return timeline;
-       }
-
-       private static Map<Pin, Wire> convertWires(Set<Pin> allPins, List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
-       {
-               Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(allPins, wires);
-               Map<Pin, Wire> logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups);
-               setGUIWiresLogicModelBinding(wires, logicWiresPerPin);
-               return logicWiresPerPin;
-       }
-
-       private static Map<Pin, Wire> createLogicWires(LogicModelParameters params, Timeline timeline, Map<Pin, Set<Pin>> connectedPinGroups)
-       {
-               Map<Pin, Wire> logicWiresPerPin = new HashMap<>();
-               Map<Set<Pin>, Wire> logicWiresPerPinGroup = new HashMap<>();
-               for (Entry<Pin, Set<Pin>> e : connectedPinGroups.entrySet())
-                       logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(),
-                                       set -> new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime)));
-               return logicWiresPerPin;
-       }
-
-       private static void setGUIWiresLogicModelBinding(List<GUIWire> wires, Map<Pin, Wire> logicWiresPerPin)
-       {
-               Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct()
-                               .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd));
-               for (GUIWire guiWire : wires)
-                       guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1())));
-       }
-
-       private static Map<Pin, Set<Pin>> getConnectedPinGroups(Set<Pin> allPins, List<GUIWire> wires)
-       {
-               Map<Pin, Set<Pin>> connectedPinsPerPin = new HashMap<>();
-
-               for (Pin p : allPins)
-               {
-                       HashSet<Pin> connectedPins = new HashSet<>();
-                       connectedPins.add(p);
-                       connectedPinsPerPin.put(p, connectedPins);
-               }
-
-               wires.forEach(wire ->
-               {
-                       Pin pin1 = wire.getPin1();
-                       Pin pin2 = wire.getPin2();
-
-                       Set<Pin> pin1ConnectedPins = connectedPinsPerPin.get(pin1);
-                       Set<Pin> 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 <G extends GUIComponent> Component createAndLinkComponent(Timeline timeline, LogicModelParameters params,
-                       GUIComponent guiComponent, Map<Pin, Wire> logicWiresPerPin, ComponentAdapter<G> adapter)
-       {
-               if (adapter == null)
-                       throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass());
-               return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin);
-       }
-
-       private ViewLogicModelAdapter()
-       {
-               throw new UnsupportedOperationException("No ViewLogicModelConverter instances");
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java b/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java
deleted file mode 100644 (file)
index 0dd563e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-
-public interface ComponentAdapter<G extends GUIComponent>
-{
-       public Class<G> getSupportedClass();
-
-       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent,
-                       Map<Pin, Wire> logicWiresPerPin);
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java b/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java
deleted file mode 100644 (file)
index 197cf74..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.GUIManualSwitch;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.components.ManualSwitch;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class ManualSwitchAdapter implements ComponentAdapter<GUIManualSwitch>
-{
-       @Override
-       public Class<GUIManualSwitch> getSupportedClass()
-       {
-               return GUIManualSwitch.class;
-       }
-
-       @Override
-       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIManualSwitch guiComponent,
-                       Map<Pin, Wire> logicWiresPerPin)
-       {
-               ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
-               ManualSwitch manualSwitch = new ManualSwitch(timeline, end);
-               guiComponent.setLogicModelBinding(manualSwitch, end);
-               return manualSwitch;
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java b/LogicUI/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java
deleted file mode 100644 (file)
index 1902d62..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.List;
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.SimpleRectangularGUIGate;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class SimpleGateAdapter<G extends SimpleRectangularGUIGate> implements ComponentAdapter<G>
-{
-       private final Class<G> supportedClass;
-       private final ComponentConstructor constructor;
-
-       public SimpleGateAdapter(Class<G> supportedClass, ComponentConstructor constructor)
-       {
-               this.supportedClass = supportedClass;
-               this.constructor = constructor;
-       }
-
-       @Override
-       public Class<G> getSupportedClass()
-       {
-               return supportedClass;
-       }
-
-       @Override
-       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent, Map<Pin, Wire> logicWiresPerPin)
-       {
-               ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
-               List<Pin> inputPins = guiComponent.getInputPins();
-               ReadEnd[] ins = new ReadEnd[inputPins.size()];
-               for (int i = 0; i < inputPins.size(); i++)
-                       ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
-               return constructor.newComponent(timeline, params.gateProcessTime, out, ins);
-       }
-
-       public static interface ComponentConstructor
-       {
-               public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
-       }
-
-}
\ No newline at end of file
diff --git a/SampleERCP/.classpath b/SampleERCP/.classpath
deleted file mode 100644 (file)
index c34bb53..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
-               <attributes>
-                       <attribute name="module" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/SampleERCP/.gitignore b/SampleERCP/.gitignore
deleted file mode 100644 (file)
index 65776c3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
\ No newline at end of file
diff --git a/SampleERCP/.project b/SampleERCP/.project
deleted file mode 100644 (file)
index 52ed088..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>net.mograsim.rcp</name>
-       <comment></comment>
-       <projects>
-               <project>net.mograsim.rcp</project>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-               <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
-       </natures>
-</projectDescription>
diff --git a/SampleERCP/.settings/org.eclipse.jdt.core.prefs b/SampleERCP/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index 132b498..0000000
+++ /dev/null
@@ -1,465 +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=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-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=1.8
-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_arrow_in_switch_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=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_switch_case_expressions=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_arrow_in_switch_case=insert
-org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=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_switch_case_expressions=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/SampleERCP/.settings/org.eclipse.jdt.ui.prefs b/SampleERCP/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644 (file)
index 5ae94b6..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_MoGraSim
-formatter_settings_version=16
-org.eclipse.jdt.ui.text.custom_code_templates=
-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/SampleERCP/.settings/org.eclipse.ltk.core.refactoring.prefs b/SampleERCP/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644 (file)
index b196c64..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/SampleERCP/.settings/org.eclipse.pde.prefs b/SampleERCP/.settings/org.eclipse.pde.prefs
deleted file mode 100644 (file)
index 90e8aa1..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.build.bin.includes=1
-compilers.p.build.encodings=1
-compilers.p.build.java.compiler=1
-compilers.p.build.java.compliance=1
-compilers.p.build.missing.output=2
-compilers.p.build.output.library=1
-compilers.p.build.source.library=1
-compilers.p.build.src.includes=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=1
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.no.automatic.module=1
-compilers.p.not-externalized-att=1
-compilers.p.service.component.without.lazyactivation=1
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/SampleERCP/.settings/org.eclipse.wst.sse.core.prefs b/SampleERCP/.settings/org.eclipse.wst.sse.core.prefs
deleted file mode 100644 (file)
index e6c26be..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-task-tags/use-project-settings=true
diff --git a/SampleERCP/.settings/org.sonarlint.eclipse.core.prefs b/SampleERCP/.settings/org.sonarlint.eclipse.core.prefs
deleted file mode 100644 (file)
index 76926ab..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-autoEnabled=true
-eclipse.preferences.version=1
-extraProperties=
-fileExclusions=
diff --git a/SampleERCP/Application.e4xmi b/SampleERCP/Application.e4xmi
deleted file mode 100644 (file)
index 3caa9c1..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_6wlLcMgZEeSyMNYR5xypkQ" elementId="Sample.application" bindingContexts="_6wlLecgZEeSyMNYR5xypkQ">
-  <children xsi:type="basic:TrimmedWindow" xmi:id="_6wlLccgZEeSyMNYR5xypkQ" elementId="Sample.window.main" label="Sample RCP4" iconURI="platform:/plugin/net.mograsim.rcp/icons/app/ico_16t.png" width="500" height="400">
-    <children xsi:type="basic:PartSashContainer" xmi:id="_6wlLksgZEeSyMNYR5xypkQ" elementId="Sample.partsashcontainer.sample">
-      <children xsi:type="basic:PartStack" xmi:id="_6wlLk8gZEeSyMNYR5xypkQ" elementId="Sample.partstack.sample">
-        <children xsi:type="basic:Part" xmi:id="_6wlLlMgZEeSyMNYR5xypkQ" elementId="Sample.part.sample" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.SamplePart" label="Sample Part" iconURI="platform:/plugin/net.mograsim.rcp/icons/home.png"/>
-        <children xsi:type="basic:Part" xmi:id="_cldhcH1HEema06ZDPR6BSw" elementId="net.mograsim.rcp.part.logicui" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.LogicUIPart" label="LogicUI part"/>
-      </children>
-      <children xsi:type="basic:PartStack" xmi:id="_l2EzYG6wEemo__tDmTCqCQ" elementId="sample.partstack.0">
-        <children xsi:type="basic:Part" xmi:id="_mW1XEG6wEemo__tDmTCqCQ" elementId="sample.part.none" label="None" tooltip="Something"/>
-      </children>
-    </children>
-    <mainMenu xmi:id="_6wlLicgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.menu">
-      <children xsi:type="menu:Menu" xmi:id="_6wlLisgZEeSyMNYR5xypkQ" elementId="file" label="File">
-        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLi8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.file.open" label="Open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
-        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.save" label="Save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
-        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjcgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.quit" label="Quit" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
-      </children>
-      <children xsi:type="menu:Menu" xmi:id="_6wlLjsgZEeSyMNYR5xypkQ" elementId="help" label="Help">
-        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLj8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.about" label="About" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
-      </children>
-    </mainMenu>
-    <trimBars xmi:id="_6wlLlcgZEeSyMNYR5xypkQ" elementId="Sample.trimbar.top">
-      <children xsi:type="menu:ToolBar" xmi:id="_6wlLlsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.toolbar">
-        <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLmMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
-        <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLl8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
-      </children>
-    </trimBars>
-  </children>
-  <handlers xmi:id="_6wlLfcgZEeSyMNYR5xypkQ" elementId="sample.handler.quitCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.QuitHandler" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
-  <handlers xmi:id="_6wlLgcgZEeSyMNYR5xypkQ" elementId="sample.handler.openCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.OpenHandler" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
-  <handlers xmi:id="_6wlLhMgZEeSyMNYR5xypkQ" elementId="sample.handler.saveCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.SaveHandler" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
-  <handlers xmi:id="_6wlLh8gZEeSyMNYR5xypkQ" elementId="sample.handler.aboutCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.AboutHandler" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
-  <bindingTables xmi:id="_6wlLfsgZEeSyMNYR5xypkQ" elementId="Sample.bindingtable" bindingContext="_6wlLecgZEeSyMNYR5xypkQ">
-    <bindings xmi:id="_6wlLf8gZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1q" keySequence="M1+Q" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
-    <bindings xmi:id="_6wlLgsgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1o" keySequence="M1+O" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
-    <bindings xmi:id="_6wlLhcgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1s" keySequence="M1+S" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
-    <bindings xmi:id="_6wlLiMgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1a" keySequence="M1+A" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
-  </bindingTables>
-  <rootContext xmi:id="_6wlLecgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
-    <children xmi:id="_6wlLesgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
-    <children xmi:id="_6wlLe8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
-  </rootContext>
-  <commands xmi:id="_6wlLfMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>
-  <commands xmi:id="_6wlLgMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.open" commandName="openCommand"/>
-  <commands xmi:id="_6wlLg8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>
-  <commands xmi:id="_6wlLhsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>
-  <addons xmi:id="_6wlLcsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
-  <addons xmi:id="_6wlLc8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
-  <addons xmi:id="_6wlLdMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
-  <addons xmi:id="_6wlLdcgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
-  <addons xmi:id="_6wlLdsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.handler.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
-  <addons xmi:id="_6wlLd8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
-  <addons xmi:id="_6wlLeMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
-</application:Application>
diff --git a/SampleERCP/LICENSE b/SampleERCP/LICENSE
deleted file mode 100644 (file)
index d3087e4..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-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.
diff --git a/SampleERCP/META-INF/MANIFEST.MF b/SampleERCP/META-INF/MANIFEST.MF
deleted file mode 100644 (file)
index 1c5e2a7..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: net.mograsim.rcp;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.200",
- org.eclipse.e4.ui.model.workbench;bundle-version="2.1.300",
- org.eclipse.jface;bundle-version="3.15.100",
- org.eclipse.e4.ui.workbench;bundle-version="1.9.0",
- org.eclipse.e4.core.di;bundle-version="1.7.100",
- org.eclipse.e4.ui.di;bundle-version="1.2.500",
- org.eclipse.ui.workbench;bundle-version="3.113.0",
- javax.annotation;bundle-version="1.2.0",
- net.mograsim.logic.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Automatic-Module-Name: Sample
-Export-Package: net.mograsim.rcp.handlers;uses:="org.eclipse.swt.widgets,org.eclipse.e4.ui.workbench,org.eclipse.e4.ui.workbench.modeling",
- net.mograsim.rcp.parts;uses:="org.eclipse.swt.widgets",
- net.mograsim.rcp.splashhandlers
diff --git a/SampleERCP/OSGI-INF/l10n/bundle.properties b/SampleERCP/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index e07734a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#Properties file for Sample
-Bundle-Vendor = MYSELF
-Bundle-Name = Sample
-product.name = Sample
-extension-point.name = Splash Extensions
-product.name.0 = Simulator WIP
\ No newline at end of file
diff --git a/SampleERCP/build.properties b/SampleERCP/build.properties
deleted file mode 100644 (file)
index d1ae984..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               Application.e4xmi,\
-               css/,\
-               splash.bmp,\
-               schema/,\
-               OSGI-INF/l10n/bundle.properties,\
-               OSGI-INF/
-source.. = src/
-src.includes = Application.e4xmi,\
-               OSGI-INF/l10n/bundle.properties,\
-               css/,\
-               icons/,\
-               schema/,\
-               splash.bmp
diff --git a/SampleERCP/css/default.css b/SampleERCP/css/default.css
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/SampleERCP/icons/af.png b/SampleERCP/icons/af.png
deleted file mode 100644 (file)
index bcd0ce8..0000000
Binary files a/SampleERCP/icons/af.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_128t.png b/SampleERCP/icons/app/ico_128t.png
deleted file mode 100644 (file)
index 5c27fb8..0000000
Binary files a/SampleERCP/icons/app/ico_128t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_16t.png b/SampleERCP/icons/app/ico_16t.png
deleted file mode 100644 (file)
index cdca854..0000000
Binary files a/SampleERCP/icons/app/ico_16t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_24t.png b/SampleERCP/icons/app/ico_24t.png
deleted file mode 100644 (file)
index 9abf17e..0000000
Binary files a/SampleERCP/icons/app/ico_24t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_256t.icns b/SampleERCP/icons/app/ico_256t.icns
deleted file mode 100644 (file)
index bcd28f2..0000000
Binary files a/SampleERCP/icons/app/ico_256t.icns and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_256t.png b/SampleERCP/icons/app/ico_256t.png
deleted file mode 100644 (file)
index 8249999..0000000
Binary files a/SampleERCP/icons/app/ico_256t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_256t.xpm b/SampleERCP/icons/app/ico_256t.xpm
deleted file mode 100644 (file)
index 4e1fa7d..0000000
+++ /dev/null
@@ -1,3009 +0,0 @@
-/* XPM */
-static char * C:\Users\Christian\Documents\Informatik_Studium\ico_256t_xpm[] = {
-"256 256 2750 2",
-"      c None",
-".     c #000000",
-"+     c #00100E",
-"@     c #001312",
-"#     c #001413",
-"$     c #001C1B",
-"%     c #001A19",
-"&     c #001515",
-"*     c #002120",
-"=     c #002221",
-"-     c #001918",
-";     c #002525",
-">     c #002927",
-",     c #002323",
-"'     c #000F0E",
-")     c #001C1A",
-"!     c #002726",
-"~     c #002C2B",
-"{     c #002928",
-"]     c #001110",
-"^     c #001E1C",
-"/     c #002727",
-"(     c #002D2C",
-"_     c #002B2B",
-":     c #002827",
-"<     c #001E1D",
-"[     c #001211",
-"}     c #001F1C",
-"|     c #002E2E",
-"1     c #002625",
-"2     c #001D1D",
-"3     c #002121",
-"4     c #002C2C",
-"5     c #001514",
-"6     c #002F2E",
-"7     c #002B2C",
-"8     c #002424",
-"9     c #001816",
-"0     c #002F2D",
-"a     c #00302F",
-"b     c #001A18",
-"c     c #002725",
-"d     c #002A29",
-"e     c #001B1A",
-"f     c #003130",
-"g     c #003131",
-"h     c #002F2F",
-"i     c #001F1D",
-"j     c #000D0B",
-"k     c #001615",
-"l     c #00110F",
-"m     c #001010",
-"n     c #001F1E",
-"o     c #002B2A",
-"p     c #002220",
-"q     c #002321",
-"r     c #002021",
-"s     c #00201E",
-"t     c #001D1C",
-"u     c #001D1B",
-"v     c #001917",
-"w     c #001716",
-"x     c #001313",
-"y     c #001111",
-"z     c #001F1F",
-"A     c #003333",
-"B     c #003231",
-"C     c #003332",
-"D     c #003232",
-"E     c #002020",
-"F     c #002E2C",
-"G     c #002929",
-"H     c #002524",
-"I     c #001E1E",
-"J     c #001818",
-"K     c #001717",
-"L     c #001414",
-"M     c #002E2F",
-"N     c #003233",
-"O     c #002E2D",
-"P     c #002423",
-"Q     c #00201F",
-"R     c #001A1A",
-"S     c #002F30",
-"T     c #003434",
-"U     c #002322",
-"V     c #003334",
-"W     c #002D2D",
-"X     c #002828",
-"Y     c #002324",
-"Z     c #002222",
-"`     c #001817",
-" .    c #003635",
-"..    c #003535",
-"+.    c #003534",
-"@.    c #003636",
-"#.    c #003433",
-"$.    c #002D2E",
-"%.    c #003533",
-"&.    c #003837",
-"*.    c #003736",
-"=.    c #003836",
-"-.    c #003735",
-";.    c #003432",
-">.    c #002C2A",
-",.    c #002422",
-"'.    c #002320",
-").    c #001C1C",
-"!.    c #003331",
-"~.    c #002A28",
-"{.    c #002624",
-"].    c #003737",
-"^.    c #002D2B",
-"/.    c #003839",
-"(.    c #003838",
-"_.    c #003939",
-":.    c #003230",
-"<.    c #002B29",
-"[.    c #003637",
-"}.    c #000C0B",
-"|.    c #001412",
-"1.    c #00393A",
-"2.    c #003A3A",
-"3.    c #002626",
-"4.    c #001715",
-"5.    c #002523",
-"6.    c #003A3B",
-"7.    c #003536",
-"8.    c #003A39",
-"9.    c #00302E",
-"0.    c #003C3C",
-"a.    c #003B3C",
-"b.    c #003B3B",
-"c.    c #003B3A",
-"d.    c #003A3C",
-"e.    c #003738",
-"f.    c #003030",
-"g.    c #00292A",
-"h.    c #001919",
-"i.    c #001614",
-"j.    c #002A2A",
-"k.    c #003C3D",
-"l.    c #003B3D",
-"m.    c #003D3D",
-"n.    c #003132",
-"o.    c #003537",
-"p.    c #003C3E",
-"q.    c #003D3C",
-"r.    c #003E3E",
-"s.    c #003E3D",
-"t.    c #003F3F",
-"u.    c #003F3E",
-"v.    c #003E3F",
-"w.    c #003C3B",
-"x.    c #003938",
-"y.    c #003D3F",
-"z.    c #004041",
-"A.    c #004040",
-"B.    c #003F40",
-"C.    c #003F41",
-"D.    c #003E40",
-"E.    c #004042",
-"F.    c #00403F",
-"G.    c #004141",
-"H.    c #004142",
-"I.    c #004241",
-"J.    c #003031",
-"K.    c #004242",
-"L.    c #003634",
-"M.    c #004140",
-"N.    c #004243",
-"O.    c #004344",
-"P.    c #004345",
-"Q.    c #004445",
-"R.    c #004244",
-"S.    c #004343",
-"T.    c #004444",
-"U.    c #002C2D",
-"V.    c #00383A",
-"W.    c #004546",
-"X.    c #004446",
-"Y.    c #004245",
-"Z.    c #004646",
-"`.    c #004143",
-" +    c #004545",
-".+    c #004647",
-"++    c #004747",
-"@+    c #004447",
-"#+    c #004547",
-"$+    c #004746",
-"%+    c #004748",
-"&+    c #00484A",
-"*+    c #004849",
-"=+    c #00474A",
-"-+    c #00484B",
-";+    c #004749",
-">+    c #004848",
-",+    c #004A4C",
-"'+    c #00494C",
-")+    c #004B4C",
-"!+    c #00494B",
-"~+    c #00494A",
-"{+    c #004A4B",
-"]+    c #004C4C",
-"^+    c #004949",
-"/+    c #004B4B",
-"(+    c #004C4D",
-"_+    c #004C4B",
-":+    c #004D4D",
-"<+    c #004D4E",
-"[+    c #004E4F",
-"}+    c #004D4F",
-"|+    c #004E4E",
-"1+    c #004C4E",
-"2+    c #004645",
-"3+    c #004E50",
-"4+    c #004F4F",
-"5+    c #004F50",
-"6+    c #004649",
-"7+    c #005052",
-"8+    c #005051",
-"9+    c #004F51",
-"0+    c #005053",
-"a+    c #005153",
-"b+    c #003D3E",
-"c+    c #005254",
-"d+    c #004B4D",
-"e+    c #005253",
-"f+    c #005152",
-"g+    c #005355",
-"h+    c #005255",
-"i+    c #005154",
-"j+    c #005356",
-"k+    c #005354",
-"l+    c #005456",
-"m+    c #005050",
-"n+    c #005455",
-"o+    c #005457",
-"p+    c #005557",
-"q+    c #005556",
-"r+    c #005658",
-"s+    c #005659",
-"t+    c #004A4A",
-"u+    c #005759",
-"v+    c #005558",
-"w+    c #004648",
-"x+    c #00575A",
-"y+    c #00585A",
-"z+    c #005859",
-"A+    c #00585B",
-"B+    c #004C4F",
-"C+    c #00595C",
-"D+    c #005A5D",
-"E+    c #005A5C",
-"F+    c #00595B",
-"G+    c #00595D",
-"H+    c #005B5D",
-"I+    c #00585C",
-"J+    c #005A5B",
-"K+    c #004D50",
-"L+    c #005B5E",
-"M+    c #005C5E",
-"N+    c #005C5F",
-"O+    c #005C5D",
-"P+    c #005B5F",
-"Q+    c #005D5E",
-"R+    c #005E60",
-"S+    c #005D5F",
-"T+    c #005E5F",
-"U+    c #005B5C",
-"V+    c #005151",
-"W+    c #005F60",
-"X+    c #004342",
-"Y+    c #005657",
-"Z+    c #005F62",
-"`+    c #005F63",
-" @    c #005E61",
-".@    c #005758",
-"+@    c #005D62",
-"@@    c #005D60",
-"#@    c #005C60",
-"$@    c #005E62",
-"%@    c #006063",
-"&@    c #005F61",
-"*@    c #006164",
-"=@    c #006364",
-"-@    c #006264",
-";@    c #006265",
-">@    c #006163",
-",@    c #006365",
-"'@    c #006465",
-")@    c #006466",
-"!@    c #006162",
-"~@    c #006064",
-"{@    c #006366",
-"]@    c #006367",
-"^@    c #006062",
-"/@    c #006567",
-"(@    c #00595A",
-"_@    c #006568",
-":@    c #006467",
-"<@    c #006566",
-"[@    c #006267",
-"}@    c #006165",
-"|@    c #006569",
-"1@    c #006469",
-"2@    c #004346",
-"3@    c #004A4D",
-"4@    c #006468",
-"5@    c #006769",
-"6@    c #006669",
-"7@    c #00676A",
-"8@    c #006668",
-"9@    c #005E63",
-"0@    c #00666A",
-"a@    c #003A38",
-"b@    c #006667",
-"c@    c #005D61",
-"d@    c #00686B",
-"e@    c #00676B",
-"f@    c #00686A",
-"g@    c #2A5B5C",
-"h@    c #00686C",
-"i@    c #00696C",
-"j@    c #00676C",
-"k@    c #004548",
-"l@    c #00696B",
-"m@    c #00666B",
-"n@    c #006B6D",
-"o@    c #006A6D",
-"p@    c #006A6C",
-"q@    c #005458",
-"r@    c #00696A",
-"s@    c #00696D",
-"t@    c #006A6E",
-"u@    c #006C6D",
-"v@    c #006B6E",
-"w@    c #005252",
-"x@    c #006C6E",
-"y@    c #006B6F",
-"z@    c #006C6F",
-"A@    c #006E71",
-"B@    c #006D6F",
-"C@    c #006E70",
-"D@    c #006D70",
-"E@    c #006C70",
-"F@    c #006D6E",
-"G@    c #006E6F",
-"H@    c #007072",
-"I@    c #006F71",
-"J@    c #007071",
-"K@    c #006D71",
-"L@    c #006F72",
-"M@    c #007073",
-"N@    c #007173",
-"O@    c #006F73",
-"P@    c #007074",
-"Q@    c #006A6B",
-"R@    c #00575B",
-"S@    c #007172",
-"T@    c #007174",
-"U@    c #006266",
-"V@    c #007175",
-"W@    c #00656A",
-"X@    c #007274",
-"Y@    c #006E72",
-"Z@    c #006368",
-"`@    c #004F52",
-" #    c #004E51",
-".#    c #007376",
-"+#    c #007275",
-"@#    c #007276",
-"##    c #007375",
-"$#    c #007477",
-"%#    c #007476",
-"&#    c #005353",
-"*#    c #007377",
-"=#    c #007578",
-"-#    c #005A5E",
-";#    c #007577",
-">#    c #005155",
-",#    c #007679",
-"'#    c #007678",
-")#    c #00777A",
-"!#    c #007779",
-"~#    c #00787A",
-"{#    c #00767A",
-"]#    c #00787B",
-"^#    c #007478",
-"/#    c #00797C",
-"(#    c #00797B",
-"_#    c #007A7C",
-":#    c #007576",
-"<#    c #007879",
-"[#    c #007A7B",
-"}#    c #006263",
-"|#    c #005C5C",
-"1#    c #007A7D",
-"2#    c #007B7E",
-"3#    c #007B7D",
-"4#    c #00797D",
-"5#    c #007273",
-"6#    c #007C7E",
-"7#    c #007A7E",
-"8#    c #007D7F",
-"9#    c #007D80",
-"0#    c #007D81",
-"a#    c #007E80",
-"b#    c #007B7C",
-"c#    c #007F81",
-"d#    c #007D7E",
-"e#    c #007C7F",
-"f#    c #007E7F",
-"g#    c #007E83",
-"h#    c #007F82",
-"i#    c #007E81",
-"j#    c #007E82",
-"k#    c #007F83",
-"l#    c #007D82",
-"m#    c #007C80",
-"n#    c #008084",
-"o#    c #004C50",
-"p#    c #008184",
-"q#    c #008083",
-"r#    c #008183",
-"s#    c #008082",
-"t#    c #008286",
-"u#    c #008487",
-"v#    c #008387",
-"w#    c #008386",
-"x#    c #008185",
-"y#    c #006B6C",
-"z#    c #008284",
-"A#    c #008588",
-"B#    c #008488",
-"C#    c #008388",
-"D#    c #008287",
-"E#    c #008285",
-"F#    c #008589",
-"G#    c #00868B",
-"H#    c #00858A",
-"I#    c #00858B",
-"J#    c #00868A",
-"K#    c #00868C",
-"L#    c #008489",
-"M#    c #00797E",
-"N#    c #004A4E",
-"O#    c #00878B",
-"P#    c #00878D",
-"Q#    c #00878C",
-"R#    c #00888D",
-"S#    c #00888C",
-"T#    c #00888B",
-"U#    c #00898C",
-"V#    c #00878E",
-"W#    c #00898D",
-"X#    c #008A8E",
-"Y#    c #00898E",
-"Z#    c #008A8F",
-"`#    c #008A8D",
-" $    c #00898F",
-".$    c #008389",
-"+$    c #008990",
-"@$    c #00777B",
-"#$    c #008C91",
-"$$    c #008D91",
-"%$    c #008C90",
-"&$    c #008D92",
-"*$    c #008B90",
-"=$    c #006D72",
-"-$    c #008B91",
-";$    c #008186",
-">$    c #008E92",
-",$    c #008F93",
-"'$    c #008E93",
-")$    c #009094",
-"!$    c #008F92",
-"~$    c #008B8F",
-"{$    c #008F94",
-"]$    c #009195",
-"^$    c #009095",
-"/$    c #009194",
-"($    c #007F84",
-"_$    c #009093",
-":$    c #006869",
-"<$    c #009296",
-"[$    c #009297",
-"}$    c #009196",
-"|$    c #009397",
-"1$    c #009197",
-"2$    c #009096",
-"3$    c #009498",
-"4$    c #009598",
-"5$    c #009398",
-"6$    c #009497",
-"7$    c #008C8F",
-"8$    c #009295",
-"9$    c #009499",
-"0$    c #009599",
-"a$    c #00959A",
-"b$    c #00969A",
-"c$    c #009399",
-"d$    c #00969B",
-"e$    c #00959B",
-"f$    c #00949A",
-"g$    c #006061",
-"h$    c #009298",
-"i$    c #00989F",
-"j$    c #00979D",
-"k$    c #00989D",
-"l$    c #00989E",
-"m$    c #00979C",
-"n$    c #00979B",
-"o$    c #00979E",
-"p$    c #00999F",
-"q$    c #009A9F",
-"r$    c #0099A0",
-"s$    c #009AA0",
-"t$    c #008C92",
-"u$    c #009AA1",
-"v$    c #00999E",
-"w$    c #008689",
-"x$    c #009BA0",
-"y$    c #009CA0",
-"z$    c #009CA1",
-"A$    c #009BA1",
-"B$    c #00787C",
-"C$    c #009DA2",
-"D$    c #009EA3",
-"E$    c #009CA2",
-"F$    c #009DA3",
-"G$    c #009EA2",
-"H$    c #009CA3",
-"I$    c #009EA5",
-"J$    c #009FA5",
-"K$    c #009EA4",
-"L$    c #009DA4",
-"M$    c #00A0A6",
-"N$    c #009EA6",
-"O$    c #009FA6",
-"P$    c #008F95",
-"Q$    c #009BA2",
-"R$    c #00A1A7",
-"S$    c #00A0A7",
-"T$    c #007A7F",
-"U$    c #00959C",
-"V$    c #00A3A9",
-"W$    c #00A2A9",
-"X$    c #00A1A8",
-"Y$    c #00A2A8",
-"Z$    c #00A3AA",
-"`$    c #009B9F",
-" %    c #00A4AA",
-".%    c #00A5AA",
-"+%    c #00A3A8",
-"@%    c #008D90",
-"#%    c #009FA4",
-"$%    c #00A5AB",
-"%%    c #00A4A9",
-"&%    c #00787D",
-"*%    c #008385",
-"=%    c #00A4AB",
-"-%    c #00A5AC",
-";%    c #00A6AC",
-">%    c #00A6AD",
-",%    c #00A6AB",
-"'%    c #00A7AC",
-")%    c #00A8AE",
-"!%    c #00A7AE",
-"~%    c #00A8B0",
-"{%    c #00A7AF",
-"]%    c #00A9AF",
-"^%    c #00A8AF",
-"/%    c #007B80",
-"(%    c #00A7AD",
-"_%    c #00A6AE",
-":%    c #00A9B0",
-"<%    c #00777C",
-"[%    c #00A9B1",
-"}%    c #00A4AC",
-"|%    c #007B7F",
-"1%    c #00AAB1",
-"2%    c #00AAB2",
-"3%    c #00A9B2",
-"4%    c #01A3AA",
-"5%    c #01AAB2",
-"6%    c #01ABB3",
-"7%    c #01AAB1",
-"8%    c #01949A",
-"9%    c #01A5AC",
-"0%    c #01A8B0",
-"a%    c #018D91",
-"b%    c #01A1A6",
-"c%    c #019498",
-"d%    c #01A6AC",
-"e%    c #01ADB4",
-"f%    c #01ACB3",
-"g%    c #01ACB4",
-"h%    c #02ACB5",
-"i%    c #02ACB4",
-"j%    c #01ACB5",
-"k%    c #02A9B2",
-"l%    c #019DA2",
-"m%    c #018286",
-"n%    c #019AA0",
-"o%    c #02A8B0",
-"p%    c #00ABB3",
-"q%    c #01ADB5",
-"r%    c #01A7AF",
-"s%    c #02999F",
-"t%    c #019399",
-"u%    c #01A6AD",
-"v%    c #02ADB4",
-"w%    c #01A9B1",
-"x%    c #019CA2",
-"y%    c #018183",
-"z%    c #02787A",
-"A%    c #01989D",
-"B%    c #02A8AF",
-"C%    c #02AEB5",
-"D%    c #02ADB5",
-"E%    c #01AEB4",
-"F%    c #02AEB4",
-"G%    c #01ADB3",
-"H%    c #02A9B1",
-"I%    c #029BA1",
-"J%    c #017B7F",
-"K%    c #018387",
-"L%    c #019FA5",
-"M%    c #02AAB2",
-"N%    c #03AEB6",
-"O%    c #02A6AD",
-"P%    c #01787B",
-"Q%    c #03AEB4",
-"R%    c #02ACB3",
-"S%    c #02A8B1",
-"T%    c #029A9F",
-"U%    c #017A7C",
-"V%    c #028084",
-"W%    c #039EA4",
-"X%    c #03AAB3",
-"Y%    c #03AEB5",
-"Z%    c #03AFB6",
-"`%    c #03AFB5",
-" &    c #03B0B6",
-".&    c #03A8AF",
-"+&    c #02989D",
-"@&    c #028B8F",
-"#&    c #03A3AB",
-"$&    c #03ACB5",
-"%&    c #02AFB6",
-"&&    c #02AEB6",
-"*&    c #03ADB4",
-"=&    c #03A5AC",
-"-&    c #028F93",
-";&    c #039FA6",
-">&    c #03ABB3",
-",&    c #02AFB5",
-"'&    c #02969A",
-")&    c #048B8F",
-"!&    c #03A3AA",
-"~&    c #04ADB5",
-"{&    c #04B1B7",
-"]&    c #05B1B8",
-"^&    c #04B0B7",
-"/&    c #04B1B8",
-"(&    c #05B0B7",
-"_&    c #05A8AF",
-":&    c #049399",
-"<&    c #026C70",
-"[&    c #039399",
-"}&    c #03A7AF",
-"|&    c #05AFB7",
-"1&    c #04ADB6",
-"2&    c #04A3AA",
-"3&    c #048A8D",
-"4&    c #038C90",
-"5&    c #03A4AA",
-"6&    c #04AEB5",
-"7&    c #049297",
-"8&    c #036B6D",
-"9&    c #049296",
-"0&    c #05B0B6",
-"a&    c #05B2B9",
-"b&    c #05A7AD",
-"c&    c #048D92",
-"d&    c #03787B",
-"e&    c #039AA0",
-"f&    c #05ABB3",
-"g&    c #05AEB5",
-"h&    c #049FA5",
-"i&    c #048185",
-"j&    c #036C6F",
-"k&    c #049397",
-"l&    c #05A9B0",
-"m&    c #04AFB7",
-"n&    c #05AFB6",
-"o&    c #04A5AD",
-"p&    c #038B8F",
-"q&    c #037477",
-"r&    c #04979E",
-"s&    c #06B3B9",
-"t&    c #06B3BA",
-"u&    c #05A3AA",
-"v&    c #04878B",
-"w&    c #05A1A6",
-"x&    c #05B2B8",
-"y&    c #05ADB4",
-"z&    c #049CA1",
-"A&    c #03767A",
-"B&    c #059BA0",
-"C&    c #06B2B9",
-"D&    c #04B2B9",
-"E&    c #04A2A8",
-"F&    c #048589",
-"G&    c #047E82",
-"H&    c #05A0A6",
-"I&    c #06AFB7",
-"J&    c #08B4BB",
-"K&    c #07B4BB",
-"L&    c #06B4BB",
-"M&    c #06B4BA",
-"N&    c #07B3BA",
-"O&    c #06B0B7",
-"P&    c #069FA5",
-"Q&    c #047F81",
-"R&    c #058B90",
-"S&    c #05A6AD",
-"T&    c #07B4BA",
-"U&    c #07B2B9",
-"V&    c #06ABB3",
-"W&    c #05989C",
-"X&    c #058084",
-"Y&    c #059FA6",
-"Z&    c #07AFB6",
-"`&    c #059EA4",
-" *    c #047D81",
-".*    c #05878C",
-"+*    c #08A6AC",
-"@*    c #09B3B9",
-"#*    c #08B5BC",
-"$*    c #09B5BC",
-"%*    c #09B4BB",
-"&*    c #09AFB6",
-"**    c #069CA1",
-"=*    c #069399",
-"-*    c #07ABB2",
-";*    c #09B5BB",
-">*    c #08B6BD",
-",*    c #09B4BA",
-"'*    c #07AAB1",
-")*    c #049298",
-"!*    c #058A8E",
-"~*    c #07A5AC",
-"{*    c #08B2B9",
-"]*    c #08B4BC",
-"^*    c #07AEB5",
-"/*    c #079AA0",
-"(*    c #079195",
-"_*    c #09AAB2",
-":*    c #0AB5BC",
-"<*    c #0AB7BE",
-"[*    c #09B6BD",
-"}*    c #0AB6BD",
-"|*    c #09ADB5",
-"1*    c #07979C",
-"2*    c #057578",
-"3*    c #08AEB5",
-"4*    c #0AB7BD",
-"5*    c #08A9AF",
-"6*    c #078D91",
-"7*    c #069296",
-"8*    c #09ACB3",
-"9*    c #0AB6BC",
-"0*    c #06969A",
-"a*    c #057174",
-"b*    c #08999F",
-"c*    c #0AB0B6",
-"d*    c #0AB8BF",
-"e*    c #09B7BE",
-"f*    c #0BB8BF",
-"g*    c #0BB7BE",
-"h*    c #09AAB1",
-"i*    c #089196",
-"j*    c #067F83",
-"k*    c #09A1A8",
-"l*    c #0AB2BA",
-"m*    c #06868A",
-"n*    c #067276",
-"o*    c #099BA0",
-"p*    c #0AB6BE",
-"q*    c #0AB5BD",
-"r*    c #078F93",
-"s*    c #077C80",
-"t*    c #0AA1A8",
-"u*    c #0BB3BA",
-"v*    c #0DBAC1",
-"w*    c #0CB9C0",
-"x*    c #0CBAC1",
-"y*    c #0BB9C0",
-"z*    c #0CB6BD",
-"A*    c #0AA9AF",
-"B*    c #098B90",
-"C*    c #07888C",
-"D*    c #0AA7AF",
-"E*    c #0DB7BE",
-"F*    c #0CBAC0",
-"G*    c #0CB2BA",
-"H*    c #077E82",
-"I*    c #0BA2A8",
-"J*    c #0AB4BB",
-"K*    c #0BBAC1",
-"L*    c #0CB9C1",
-"M*    c #0BB6BE",
-"N*    c #07888E",
-"O*    c #08868B",
-"P*    c #0BA6AE",
-"Q*    c #0DBBC2",
-"R*    c #0CBBC2",
-"S*    c #0EBBC2",
-"T*    c #0CBBC1",
-"U*    c #0DBBC1",
-"V*    c #0DBAC2",
-"W*    c #0DB9C0",
-"X*    c #0BB5BB",
-"Y*    c #0BA4AB",
-"Z*    c #088488",
-"`*    c #0A9297",
-" =    c #0BACB3",
-".=    c #0EBAC1",
-"+=    c #0A9CA2",
-"@=    c #08888D",
-"#=    c #0BA7AE",
-"$=    c #0EB7BD",
-"%=    c #0EBAC2",
-"&=    c #0CB4BB",
-"*=    c #0AA3AA",
-"==    c #088085",
-"-=    c #05585C",
-";=    c #098F94",
-">=    c #0DABB3",
-",=    c #0CB8BF",
-"'=    c #0EBCC2",
-")=    c #0EBCC3",
-"!=    c #0FBCC3",
-"~=    c #0EB5BC",
-"{=    c #0AA0A6",
-"]=    c #0A999F",
-"^=    c #0CB1B8",
-"/=    c #0FBBC1",
-"(=    c #0DB0B7",
-"_=    c #0A959B",
-":=    c #0A9196",
-"<=    c #0DADB4",
-"[=    c #0EB9C0",
-"}=    c #0FBBC2",
-"|=    c #0EBAC0",
-"1=    c #0EB3BB",
-"2=    c #0B9FA4",
-"3=    c #097B80",
-"4=    c #0A969C",
-"5=    c #0DB1B7",
-"6=    c #0FBDC3",
-"7=    c #10BDC4",
-"8=    c #0EBDC3",
-"9=    c #0FBCC4",
-"0=    c #10BCC2",
-"a=    c #0EB4BA",
-"b=    c #0B9BA0",
-"c=    c #087C80",
-"d=    c #0CA3A9",
-"e=    c #0FB7BD",
-"f=    c #0FBEC3",
-"g=    c #0FBDC2",
-"h=    c #0FBDC4",
-"i=    c #10BAC1",
-"j=    c #0DACB3",
-"k=    c #0A9095",
-"l=    c #0B999F",
-"m=    c #0EB2BA",
-"n=    c #0EBDC2",
-"o=    c #0FBCC2",
-"p=    c #10BDC3",
-"q=    c #0EB2B9",
-"r=    c #0B989F",
-"s=    c #0C959A",
-"t=    c #09787B",
-"u=    c #0C9FA5",
-"v=    c #10B6BE",
-"w=    c #11BEC4",
-"x=    c #10BEC4",
-"y=    c #12BFC6",
-"z=    c #11BEC5",
-"A=    c #11BFC5",
-"B=    c #10BFC4",
-"C=    c #12BEC5",
-"D=    c #11BFC6",
-"E=    c #11BDC3",
-"F=    c #0DB0B8",
-"G=    c #0B9498",
-"H=    c #0A868A",
-"I=    c #0CA7AE",
-"J=    c #10BBC0",
-"K=    c #10BFC5",
-"L=    c #11BDC5",
-"M=    c #12BFC5",
-"N=    c #10B9C0",
-"O=    c #0DAAB0",
-"P=    c #0A898E",
-"Q=    c #0A7B7F",
-"R=    c #0CA2A8",
-"S=    c #10B7BE",
-"T=    c #10BEC5",
-"U=    c #0EB0B7",
-"V=    c #0A9197",
-"W=    c #0DA2A9",
-"X=    c #11B0B8",
-"Y=    c #0D9DA3",
-"Z=    c #0B8487",
-"`=    c #0EA7AF",
-" -    c #11BBC1",
-".-    c #13C1C7",
-"+-    c #12C0C6",
-"@-    c #14C1C7",
-"#-    c #12C1C7",
-"$-    c #13C0C6",
-"%-    c #11BCC2",
-"&-    c #0EACB3",
-"*-    c #0B8D91",
-"=-    c #0A8E94",
-"--    c #10AFB6",
-";-    c #12C1C6",
-">-    c #11B9C0",
-",-    c #0EA7AD",
-"'-    c #0A8689",
-")-    c #10A9B0",
-"!-    c #12BCC2",
-"~-    c #13C0C5",
-"{-    c #11C0C6",
-"]-    c #12C0C5",
-"^-    c #12BDC4",
-"/-    c #0B8C90",
-"(-    c #0FA8B0",
-"_-    c #12BBC2",
-":-    c #11B3BB",
-"<-    c #0D969B",
-"[-    c #0C8D91",
-"}-    c #10AEB5",
-"|-    c #13BEC4",
-"1-    c #14C2C8",
-"2-    c #13BCC3",
-"3-    c #10A9B1",
-"4-    c #0E999F",
-"5-    c #10B3BA",
-"6-    c #13BFC5",
-"7-    c #13C2C8",
-"8-    c #15C2C8",
-"9-    c #15C1C7",
-"0-    c #12B8BE",
-"a-    c #0EA0A6",
-"b-    c #0D8E93",
-"c-    c #11AEB5",
-"d-    c #13BDC4",
-"e-    c #10A9AF",
-"f-    c #104547",
-"g-    c #0A8085",
-"h-    c #11AFB5",
-"i-    c #14BEC5",
-"j-    c #11AFB6",
-"k-    c #0D8F94",
-"l-    c #0D959B",
-"m-    c #11B3BA",
-"n-    c #14BFC6",
-"o-    c #15C3C9",
-"p-    c #16C3C9",
-"q-    c #16C2C8",
-"r-    c #13B9C0",
-"s-    c #10A5AB",
-"t-    c #0A787C",
-"u-    c #10A2A8",
-"v-    c #13B9BF",
-"w-    c #17C3C9",
-"x-    c #13B6BD",
-"y-    c #0F9BA1",
-"z-    c #0D989E",
-"A-    c #13B4BC",
-"B-    c #10A3A9",
-"C-    c #0E8B90",
-"D-    c #14B4BB",
-"E-    c #18C3C9",
-"F-    c #17C4CA",
-"G-    c #16BFC6",
-"H-    c #11ABB2",
-"I-    c #10A0A6",
-"J-    c #16BAC1",
-"K-    c #17C2C8",
-"L-    c #18C5CA",
-"M-    c #18C5CB",
-"N-    c #16C1C7",
-"O-    c #16B9BF",
-"P-    c #109FA5",
-"Q-    c #0C8286",
-"R-    c #12A9AF",
-"S-    c #15BDC3",
-"T-    c #13B3B9",
-"U-    c #0F949A",
-"V-    c #10A1A7",
-"W-    c #15BAC2",
-"X-    c #15B8BF",
-"Y-    c #0F9DA3",
-"Z-    c #0F9297",
-"`-    c #15B7BD",
-" ;    c #19C6CC",
-".;    c #19C5CA",
-"+;    c #17BCC3",
-"@;    c #12A6AD",
-"#;    c #0C8185",
-"$;    c #12A8AF",
-"%;    c #17BDC4",
-"&;    c #19C5CB",
-"*;    c #19C6CD",
-"=;    c #19C6CB",
-"-;    c #18C5CC",
-";;    c #17B6BD",
-">;    c #10999F",
-",;    c #0F8D92",
-"';    c #15B0B8",
-");    c #18C1C8",
-"!;    c #1AC7CC",
-"~;    c #18C6CB",
-"{;    c #17C0C6",
-"];    c #14AFB6",
-"^;    c #0D8388",
-"/;    c #14AAAF",
-"(;    c #17BFC5",
-"_;    c #1AC6CC",
-":;    c #19C2C9",
-"<;    c #15B4BA",
-"[;    c #11979C",
-"};    c #11989D",
-"|;    c #17BAC0",
-"1;    c #1AC7CD",
-"2;    c #19C7CC",
-"3;    c #18BBC2",
-"4;    c #139FA6",
-"5;    c #0E8A90",
-"6;    c #16AFB5",
-"7;    c #19C1C8",
-"8;    c #1BC8CD",
-"9;    c #1AC2C9",
-"0;    c #15B2B8",
-"a;    c #109196",
-"b;    c #16B6BD",
-"c;    c #1AC5CB",
-"d;    c #1AC7CE",
-"e;    c #18BFC5",
-"f;    c #14AAB1",
-"g;    c #0F8C92",
-"h;    c #15B0B7",
-"i;    c #19C2C8",
-"j;    c #1BC7CD",
-"k;    c #1AC7CB",
-"l;    c #1BC8CE",
-"m;    c #16B1B9",
-"n;    c #108F94",
-"o;    c #139FA4",
-"p;    c #1ABFC5",
-"q;    c #1CCACF",
-"r;    c #1CC9CF",
-"s;    c #1CC9CE",
-"t;    c #1BC6CB",
-"u;    c #19B8BF",
-"v;    c #1299A0",
-"w;    c #12949A",
-"x;    c #18B5BC",
-"y;    c #1AC4C9",
-"z;    c #1CC8CE",
-"A;    c #1BC8CF",
-"B;    c #1CC9CD",
-"C;    c #1BC7CE",
-"D;    c #1AC2C8",
-"E;    c #17B0B6",
-"F;    c #13A1A7",
-"G;    c #19BCC2",
-"H;    c #1CC8CD",
-"I;    c #1BC9CE",
-"J;    c #1CC7CD",
-"K;    c #1ABEC4",
-"L;    c #14A5AB",
-"M;    c #11979D",
-"N;    c #18B7BD",
-"O;    c #1AC4CA",
-"P;    c #1CC8CF",
-"Q;    c #1AC1C8",
-"R;    c #16AEB4",
-"S;    c #15A5AB",
-"T;    c #1DC3C9",
-"U;    c #1DCBCF",
-"V;    c #1ECBD0",
-"W;    c #1DCACF",
-"X;    c #1CC6CC",
-"Y;    c #19B5BB",
-"Z;    c #129398",
-"`;    c #159EA4",
-" >    c #1ABBC1",
-".>    c #1DC8CD",
-"+>    c #1DCAD0",
-"@>    c #1DCBD0",
-"#>    c #1ECCD0",
-"$>    c #1CC2C7",
-"%>    c #17AAB0",
-"&>    c #0F8084",
-"*>    c #16A9AF",
-"=>    c #1CC2C6",
-"->    c #1DC9CE",
-";>    c #1ABCC2",
-">>    c #14A0A5",
-",>    c #14A1A7",
-"'>    c #1ABDC3",
-")>    c #1DC7CE",
-"!>    c #1DCBD1",
-"~>    c #1BC1C7",
-"{>    c #17ABB1",
-"]>    c #1DC6CC",
-"^>    c #20CED2",
-"/>    c #1FCCD1",
-"(>    c #1FCDD1",
-"_>    c #1ECCD1",
-":>    c #1EC6CB",
-"<>    c #1AB2B8",
-"[>    c #17A7AD",
-"}>    c #1DC1C7",
-"|>    c #20CCD1",
-"1>    c #1FCDD2",
-"2>    c #20CDD2",
-"3>    c #1FCED2",
-"4>    c #1FCBD0",
-"5>    c #1DC0C7",
-"6>    c #18A5AB",
-"7>    c #128B90",
-"8>    c #19B1B8",
-"9>    c #1DC5CA",
-"0>    c #1EC8CD",
-"a>    c #1BBAC0",
-"b>    c #15999D",
-"c>    c #107F83",
-"d>    c #18A9AF",
-"e>    c #1CC0C7",
-"f>    c #1FCCD2",
-"g>    c #1CBEC5",
-"h>    c #12A0A5",
-"i>    c #016E73",
-"j>    c #1AB1B8",
-"k>    c #1FCACF",
-"l>    c #20CDD0",
-"m>    c #1EC3C9",
-"n>    c #19ABB2",
-"o>    c #12888B",
-"p>    c #1AB0B6",
-"q>    c #1EC5CB",
-"r>    c #20CDD1",
-"s>    c #20CBCF",
-"t>    c #1CBBC1",
-"u>    c #159CA1",
-"v>    c #15959B",
-"w>    c #1CB8BE",
-"x>    c #1FC7CC",
-"y>    c #1FC8CD",
-"z>    c #1BB5BC",
-"A>    c #138F94",
-"B>    c #12898F",
-"C>    c #19B0B7",
-"D>    c #20CACF",
-"E>    c #1DBCC2",
-"F>    c #12888C",
-"G>    c #1CB8BD",
-"H>    c #20CCD0",
-"I>    c #20CFD3",
-"J>    c #21CFD3",
-"K>    c #20CED3",
-"L>    c #1EC1C6",
-"M>    c #18A4A9",
-"N>    c #149197",
-"O>    c #1BB7BD",
-"P>    c #20C9CF",
-"Q>    c #1FC9CE",
-"R>    c #149499",
-"S>    c #17A0A5",
-"T>    c #1CBDC3",
-"U>    c #20CAD0",
-"V>    c #21CFD2",
-"W>    c #1FC6CB",
-"X>    c #1BAFB6",
-"Y>    c #1CB7BD",
-"Z>    c #1FCED3",
-"`>    c #1FC7CD",
-" ,    c #1CB6BD",
-".,    c #0F8D93",
-"+,    c #158F94",
-"@,    c #1EBCC3",
-"#,    c #22CFD3",
-"$,    c #21D1D4",
-"%,    c #21D0D4",
-"&,    c #21D0D5",
-"*,    c #21D1D5",
-"=,    c #20CFD4",
-"-,    c #22D1D5",
-";,    c #22D0D4",
-">,    c #21CDD1",
-",,    c #1EBFC4",
-"',    c #179DA2",
-"),    c #189EA2",
-"!,    c #1FBEC4",
-"~,    c #22D1D4",
-"{,    c #20C8CD",
-"],    c #1CB4B9",
-"^,    c #1AA8AE",
-"/,    c #1FC4C9",
-"(,    c #21CED2",
-"_,    c #1FC5CA",
-":,    c #19A9AF",
-"<,    c #189FA4",
-"[,    c #21CDD2",
-"},    c #22D0D5",
-"|,    c #21CFD4",
-"1,    c #1BB1B7",
-"2,    c #004B4E",
-"3,    c #17979D",
-"4,    c #20C1C7",
-"5,    c #23D2D6",
-"6,    c #24D3D5",
-"7,    c #23D2D5",
-"8,    c #24D3D7",
-"9,    c #24D2D6",
-"0,    c #23CED2",
-"a,    c #1FBAC1",
-"b,    c #17969A",
-"c,    c #1BA8AD",
-"d,    c #21C4C9",
-"e,    c #24D3D6",
-"f,    c #23D0D4",
-"g,    c #21C8CC",
-"h,    c #1DAEB5",
-"i,    c #15888C",
-"j,    c #1DB1B7",
-"k,    c #22C9CF",
-"l,    c #23D1D5",
-"m,    c #23D3D6",
-"n,    c #23D0D3",
-"o,    c #19A3A8",
-"p,    c #1BA9AF",
-"q,    c #22C6CB",
-"r,    c #23D0D5",
-"s,    c #23D3D5",
-"t,    c #22C7CC",
-"u,    c #13A7AD",
-"v,    c #005256",
-"w,    c #189EA3",
-"x,    c #22C5CA",
-"y,    c #25D3D7",
-"z,    c #26D4D7",
-"A,    c #26D4D8",
-"B,    c #25D2D6",
-"C,    c #23CCD0",
-"D,    c #1EB6BC",
-"E,    c #148588",
-"F,    c #1DAFB4",
-"G,    c #22C8CD",
-"H,    c #25D2D5",
-"I,    c #26D3D7",
-"J,    c #25D3D6",
-"K,    c #26D4D6",
-"L,    c #25D4D7",
-"M,    c #21C6CA",
-"N,    c #1BA8AE",
-"O,    c #179297",
-"P,    c #20B9BE",
-"Q,    c #23CDD0",
-"R,    c #24CFD3",
-"S,    c #20BEC3",
-"T,    c #189AA0",
-"U,    c #14868B",
-"V,    c #1DB2B7",
-"W,    c #24D1D5",
-"X,    c #1FC2C8",
-"Y,    c #21A7AD",
-"Z,    c #1CA6AB",
-"`,    c #23C9CD",
-" '    c #27D5D8",
-".'    c #27D4D8",
-"+'    c #26D5D8",
-"@'    c #23CBCF",
-"#'    c #1EAFB4",
-"$'    c #178E93",
-"%'    c #1FB7BC",
-"&'    c #24CCD0",
-"*'    c #27D4D7",
-"='    c #27D5D7",
-"-'    c #25D1D5",
-";'    c #21C2C7",
-">'    c #1BA2A6",
-",'    c #1A9DA2",
-"''    c #21BFC4",
-")'    c #25D0D5",
-"!'    c #25CED1",
-"~'    c #20B9BF",
-"{'    c #179196",
-"]'    c #20B8BD",
-"^'    c #24CDD1",
-"/'    c #25D0D4",
-"('    c #19BCC1",
-"_'    c #10979C",
-":'    c #1EACB2",
-"<'    c #27CED2",
-"['    c #29D8DA",
-"}'    c #29D7DA",
-"|'    c #28D7DA",
-"1'    c #29D8DB",
-"2'    c #29D6D9",
-"3'    c #28D4D7",
-"4'    c #24C6CB",
-"5'    c #1DA9AE",
-"6'    c #1A999E",
-"7'    c #22BEC3",
-"8'    c #27D2D5",
-"9'    c #28D6D9",
-"0'    c #23BEC4",
-"a'    c #1A999D",
-"b'    c #1DA7AC",
-"c'    c #25C7CA",
-"d'    c #28D4D8",
-"e'    c #29D7D9",
-"f'    c #26CDD0",
-"g'    c #1FB5B9",
-"h'    c #1B9DA2",
-"i'    c #21BFC5",
-"j'    c #27D2D6",
-"k'    c #28D1D4",
-"l'    c #1AB9BE",
-"m'    c #026D72",
-"n'    c #20B4B9",
-"o'    c #28D4D6",
-"p'    c #23C3C8",
-"q'    c #1CA1A6",
-"r'    c #1DA4A8",
-"s'    c #25C5CA",
-"t'    c #29D4D8",
-"u'    c #2AD9DB",
-"v'    c #28D8DA",
-"w'    c #2AD8DB",
-"x'    c #2AD8DA",
-"y'    c #26CFD3",
-"z'    c #21B7BD",
-"A'    c #1FB0B5",
-"B'    c #27CCD0",
-"C'    c #28D8DB",
-"D'    c #28D6D8",
-"E'    c #26CACF",
-"F'    c #1EADB3",
-"G'    c #1EA6AA",
-"H'    c #26C6CB",
-"I'    c #29D5D8",
-"J'    c #27CFD3",
-"K'    c #1CAFB4",
-"L'    c #168488",
-"M'    c #23BABF",
-"N'    c #2AD5D8",
-"O'    c #2ADADD",
-"P'    c #2AD9DC",
-"Q'    c #2ADADC",
-"R'    c #2ADADB",
-"S'    c #2ADBDC",
-"T'    c #29D9DA",
-"U'    c #29D2D6",
-"V'    c #23BFC4",
-"W'    c #1B999E",
-"X'    c #1FAEB2",
-"Y'    c #26CBCF",
-"Z'    c #2AD7DB",
-"`'    c #29D9DB",
-" )    c #28CDD1",
-".)    c #20B1B6",
-"+)    c #198F95",
-"@)    c #22B9BF",
-"#)    c #2AD9DD",
-"$)    c #2BDADC",
-"%)    c #2AD6D9",
-"&)    c #1EA5AB",
-"*)    c #20AFB5",
-"=)    c #29D8DC",
-"-)    c #2ADBDD",
-";)    c #2BD8DA",
-">)    c #26C8CD",
-",)    c #178A8F",
-"')    c #25C0C5",
-"))    c #2CD9DC",
-"!)    c #2CDDDF",
-"~)    c #2BDBDD",
-"{)    c #2CDBDD",
-"])    c #2BDCDD",
-"^)    c #2DDCDE",
-"/)    c #2CDCDD",
-"()    c #2CDBDE",
-"_)    c #2CDDDE",
-":)    c #29D2D5",
-"<)    c #24BAC0",
-"[)    c #188B90",
-"})    c #23B7BD",
-"|)    c #2AD0D4",
-"1)    c #2CDCDE",
-"2)    c #2BDBDC",
-"3)    c #2DDCDD",
-"4)    c #2CDBDC",
-"5)    c #2BD8DB",
-"6)    c #28CACF",
-"7)    c #21ADB1",
-"8)    c #1C9AA0",
-"9)    c #26C1C6",
-"0)    c #2DDDDD",
-"a)    c #2BDADD",
-"b)    c #2BD7D9",
-"c)    c #26C3C8",
-"d)    c #1D9FA4",
-"e)    c #198D92",
-"f)    c #23B9BD",
-"g)    c #2CDDDD",
-"h)    c #2BD7D8",
-"i)    c #1A9397",
-"j)    c #27C6CA",
-"k)    c #2EDBDD",
-"l)    c #2DDEDF",
-"m)    c #2DDDDF",
-"n)    c #2EDDDF",
-"o)    c #2DDEDE",
-"p)    c #2EDEDF",
-"q)    c #2DDDDE",
-"r)    c #2EDEDE",
-"s)    c #2BD1D4",
-"t)    c #22B5BA",
-"u)    c #1C969B",
-"v)    c #27C0C5",
-"w)    c #2CD6D8",
-"x)    c #2DDBDD",
-"y)    c #28C8CC",
-"z)    c #1FA4AA",
-"A)    c #1FA5AA",
-"B)    c #2CD9DB",
-"C)    c #2AD4D7",
-"D)    c #26C0C4",
-"E)    c #1D999D",
-"F)    c #26C0C5",
-"G)    c #2BD6D9",
-"H)    c #2EDDDE",
-"I)    c #07575A",
-"J)    c #1E9DA0",
-"K)    c #29CACE",
-"L)    c #2EE0E1",
-"M)    c #2EDFE0",
-"N)    c #2FDFE0",
-"O)    c #2EDEE0",
-"P)    c #2EDCDE",
-"Q)    c #2ACED2",
-"R)    c #22AEB2",
-"S)    c #1FA2A6",
-"T)    c #29C6CA",
-"U)    c #2DD9DC",
-"V)    c #2EDFDF",
-"W)    c #2CD8DA",
-"X)    c #27C3C8",
-"Y)    c #1D9CA1",
-"Z)    c #23AFB3",
-"`)    c #2ACED1",
-" !    c #2FDFDF",
-".!    c #2CD4D7",
-"+!    c #25B9BD",
-"@!    c #1FA3A8",
-"#!    c #29C9CC",
-"$!    c #2DDADC",
-"%!    c #085E62",
-"&!    c #21A3A9",
-"*!    c #2CCFD2",
-"=!    c #2FE0E1",
-"-!    c #30E1E1",
-";!    c #30E0E1",
-">!    c #2AC9CC",
-",!    c #22A5AA",
-"'!    c #22ABB1",
-")!    c #2BCCD0",
-"!!    c #2DDBDC",
-"~!    c #2DD6D9",
-"{!    c #27BEC4",
-"]!    c #24B8BD",
-"^!    c #2CD3D7",
-"/!    c #2FDEE0",
-"(!    c #2FDEDF",
-"_!    c #2CD1D4",
-":!    c #23B2B7",
-"<!    c #23AEB2",
-"[!    c #0A666B",
-"}!    c #23ABB1",
-"|!    c #2DD3D5",
-"1!    c #2EDADD",
-"2!    c #2AC3C8",
-"3!    c #25B5BA",
-"4!    c #2DD3D4",
-"5!    c #30DFE0",
-"6!    c #2DD4D6",
-"7!    c #26B7BC",
-"8!    c #1C959A",
-"9!    c #28C1C6",
-"0!    c #2ED9DB",
-"a!    c #30E1E2",
-"b!    c #2FDDDF",
-"c!    c #23AAB0",
-"d!    c #26B8BD",
-"e!    c #0C6E72",
-"f!    c #25B4B9",
-"g!    c #2ED7D8",
-"h!    c #31E3E3",
-"i!    c #32E2E3",
-"j!    c #31E1E2",
-"k!    c #32E2E2",
-"l!    c #31E2E2",
-"m!    c #32E3E3",
-"n!    c #2ED8DA",
-"o!    c #29BFC3",
-"p!    c #1E9498",
-"q!    c #28BFC2",
-"r!    c #2FD8DA",
-"s!    c #32E3E2",
-"t!    c #31E1E1",
-"u!    c #31DFE1",
-"v!    c #2ED2D4",
-"w!    c #24AEB4",
-"x!    c #22A3A7",
-"y!    c #2BC8CD",
-"z!    c #2FDDDE",
-"A!    c #31E2E1",
-"B!    c #32E1E2",
-"C!    c #30DDDE",
-"D!    c #2BC8CA",
-"E!    c #21A1A6",
-"F!    c #1E969A",
-"G!    c #29C0C3",
-"H!    c #2FD7DA",
-"I!    c #32E1E1",
-"J!    c #30E2E2",
-"K!    c #32E1E3",
-"L!    c #12787C",
-"M!    c #29BCC0",
-"N!    c #31DDDD",
-"O!    c #33E5E4",
-"P!    c #33E3E3",
-"Q!    c #33E4E3",
-"R!    c #33E4E4",
-"S!    c #2FD6D8",
-"T!    c #28B7BC",
-"U!    c #219EA2",
-"V!    c #2CC7CB",
-"W!    c #31DDDE",
-"X!    c #34E4E3",
-"Y!    c #32E4E3",
-"Z!    c #32E0E0",
-"`!    c #2CCCCF",
-" ~    c #24A7AC",
-".~    c #24ADB2",
-"+~    c #2ED1D3",
-"@~    c #32E4E4",
-"#~    c #33E3E4",
-"$~    c #33E2E3",
-"%~    c #34E4E4",
-"&~    c #30DBDC",
-"*~    c #2BC2C6",
-"=~    c #22A1A6",
-"-~    c #2CC8CB",
-";~    c #1C868A",
-">~    c #2BC3C6",
-",~    c #34E0E0",
-"'~    c #34E5E5",
-")~    c #34E5E4",
-"!~    c #34E6E5",
-"~~    c #34E6E4",
-"{~    c #35E6E5",
-"]~    c #34E6E6",
-"^~    c #33E2E2",
-"/~    c #2FD4D6",
-"(~    c #26B1B6",
-"_~    c #24A9AE",
-":~    c #2ED0D1",
-"<~    c #34E2E2",
-"[~    c #35E6E6",
-"}~    c #35E5E4",
-"|~    c #32DEDF",
-"1~    c #2DC8CB",
-"2~    c #31D8D9",
-"3~    c #34E5E6",
-"4~    c #35E5E5",
-"5~    c #35E4E3",
-"6~    c #31DADB",
-"7~    c #2ABFC2",
-"8~    c #26ACB0",
-"9~    c #2ECFD2",
-"0~    c #1F8F93",
-"a~    c #34E3E3",
-"b~    c #36E8E7",
-"c~    c #37E8E7",
-"d~    c #37E7E6",
-"e~    c #36E7E6",
-"f~    c #37E7E7",
-"g~    c #36E6E6",
-"h~    c #35E2E3",
-"i~    c #2FD0D2",
-"j~    c #25A9AD",
-"k~    c #28B4B8",
-"l~    c #31D7D9",
-"m~    c #37E5E5",
-"n~    c #36E8E6",
-"o~    c #36E7E5",
-"p~    c #36E7E7",
-"q~    c #33DEDE",
-"r~    c #2CC3C7",
-"s~    c #209397",
-"t~    c #2CC1C4",
-"u~    c #32DDDD",
-"v~    c #35E7E5",
-"w~    c #35E7E6",
-"x~    c #37E8E6",
-"y~    c #36E6E5",
-"z~    c #31D9DB",
-"A~    c #29B7BB",
-"B~    c #29B6BB",
-"C~    c #32D7D9",
-"D~    c #36E5E4",
-"E~    c #21979C",
-"F~    c #2FCDD0",
-"G~    c #36E5E6",
-"H~    c #38E9E8",
-"I~    c #38E8E8",
-"J~    c #38E8E7",
-"K~    c #38E7E7",
-"L~    c #35E1E2",
-"M~    c #2ECBCD",
-"N~    c #2BBFC2",
-"O~    c #33DCDE",
-"P~    c #37E6E6",
-"Q~    c #37E8E8",
-"R~    c #33DBDB",
-"S~    c #2BBCC0",
-"T~    c #239DA2",
-"U~    c #2FC9CC",
-"V~    c #31D4D6",
-"W~    c #27AEB3",
-"X~    c #34DDDE",
-"Y~    c #186467",
-"Z~    c #239EA2",
-"`~    c #32D2D5",
-" {    c #39E9E8",
-".{    c #39E8E8",
-"+{    c #35E0E0",
-"@{    c #2EC5C7",
-"#{    c #239B9E",
-"${    c #2EC7CA",
-"%{    c #35E1E1",
-"&{    c #32D7D8",
-"*{    c #2AB5B8",
-"={    c #25A8AC",
-"-{    c #32D0D2",
-";{    c #37E4E4",
-">{    c #2FCFD0",
-",{    c #239CA0",
-"'{    c #2EC9CC",
-"){    c #36E1E1",
-"!{    c #3AEAE8",
-"~{    c #39E9E7",
-"{{    c #239EA1",
-"]{    c #32D2D3",
-"^{    c #39E7E7",
-"/{    c #3AEAE9",
-"({    c #3AE8E7",
-"_{    c #35DDDD",
-":{    c #2CBDC0",
-"<{    c #26A6AA",
-"[{    c #31D0D1",
-"}{    c #37E4E3",
-"|{    c #3AE9E8",
-"1{    c #38E5E4",
-"2{    c #31D3D4",
-"3{    c #27ADB0",
-"4{    c #2AB4B9",
-"5{    c #33D8D9",
-"6{    c #36E2E1",
-"7{    c #2FC8CC",
-"8{    c #27A8AC",
-"9{    c #31D2D4",
-"0{    c #37E5E4",
-"a{    c #0A8084",
-"b{    c #30C7CA",
-"c{    c #38E3E3",
-"d{    c #3BEBE9",
-"e{    c #3BECEA",
-"f{    c #3CECEA",
-"g{    c #34D8D9",
-"h{    c #2AB3B6",
-"i{    c #2AB2B5",
-"j{    c #33D8D8",
-"k{    c #39E7E6",
-"l{    c #37E3E3",
-"m{    c #31CDCF",
-"n{    c #2CBFC2",
-"o{    c #37E0E0",
-"p{    c #3BEAE9",
-"q{    c #36DFDF",
-"r{    c #2DC1C4",
-"s{    c #2AB4B8",
-"t{    c #35D9DA",
-"u{    c #3BEAE8",
-"v{    c #149BA0",
-"w{    c #36D7D7",
-"x{    c #3CE9E7",
-"y{    c #3DEDEB",
-"z{    c #3DECEB",
-"A{    c #3DEDEC",
-"B{    c #3EEEEB",
-"C{    c #3EEDEB",
-"D{    c #3BE9E8",
-"E{    c #34D4D5",
-"F{    c #28ACB0",
-"G{    c #2DBDC0",
-"H{    c #37DEDE",
-"I{    c #3DEAE9",
-"J{    c #3DEEEB",
-"K{    c #3EEDEC",
-"L{    c #39E5E3",
-"M{    c #31C9CA",
-"N{    c #249B9E",
-"O{    c #31CBCD",
-"P{    c #3AE5E4",
-"Q{    c #3DEDEA",
-"R{    c #3CEBE9",
-"S{    c #37DCDC",
-"T{    c #2CBBBD",
-"U{    c #2FBFC2",
-"V{    c #37DFDF",
-"W{    c #14A7AA",
-"X{    c #39DDDC",
-"Y{    c #3DEBEA",
-"Z{    c #3FEEEC",
-"`{    c #3EEEED",
-" ]    c #3EEFED",
-".]    c #3FEDEC",
-"+]    c #3FEFED",
-"@]    c #3EEEEC",
-"#]    c #3EEDED",
-"$]    c #3CE7E6",
-"%]    c #33CFD0",
-"&]    c #249599",
-"*]    c #31C6C8",
-"=]    c #3AE4E2",
-"-]    c #3FEEED",
-";]    c #3FEDED",
-">]    c #38E1E0",
-",]    c #2FC2C3",
-"']    c #28A6AA",
-")]    c #34D2D4",
-"!]    c #3DEAE8",
-"~]    c #36DADA",
-"{]    c #2CB3B6",
-"]]    c #23999D",
-"^]    c #30C9CA",
-"/]    c #3AE4E3",
-"(]    c #23B9BB",
-"_]    c #39E1E1",
-":]    c #3FEEEB",
-"<]    c #40EFED",
-"[]    c #40F0ED",
-"}]    c #40EEED",
-"|]    c #3FEFEC",
-"1]    c #3BE5E3",
-"2]    c #32C9CB",
-"3]    c #26A1A5",
-"4]    c #33D0D0",
-"5]    c #3DE8E7",
-"6]    c #40EFEE",
-"7]    c #3FF0ED",
-"8]    c #40F0EE",
-"9]    c #38DDDD",
-"0]    c #2CB7BB",
-"a]    c #2BB2B6",
-"b]    c #37DADA",
-"c]    c #3EEBE9",
-"d]    c #3DEAE7",
-"e]    c #35D5D6",
-"f]    c #28A4A7",
-"g]    c #35D1D3",
-"h]    c #3DE9E7",
-"i]    c #0C868C",
-"j]    c #33CACB",
-"k]    c #3DE7E4",
-"l]    c #40EFEC",
-"m]    c #41F1ED",
-"n]    c #41F0ED",
-"o]    c #3AE2E1",
-"p]    c #30C1C4",
-"q]    c #2BADB0",
-"r]    c #37D8D8",
-"s]    c #3FECEA",
-"t]    c #41F1EE",
-"u]    c #3EECEA",
-"v]    c #2BAEB3",
-"w]    c #2FBDC0",
-"x]    c #3AE0E0",
-"y]    c #40EDEA",
-"z]    c #40F1ED",
-"A]    c #3DE8E6",
-"B]    c #34CED0",
-"C]    c #2BB0B4",
-"D]    c #38D9D9",
-"E]    c #3FEBE9",
-"F]    c #40F0EC",
-"G]    c #1E9DA2",
-"H]    c #36D2D3",
-"I]    c #3FEAE8",
-"J]    c #42F0EE",
-"K]    c #42F1EE",
-"L]    c #43F2EF",
-"M]    c #43F1EE",
-"N]    c #41EEEC",
-"O]    c #3ADEDE",
-"P]    c #2FB9BC",
-"Q]    c #2FBABD",
-"R]    c #3AE0DF",
-"S]    c #42F1ED",
-"T]    c #3FEBE8",
-"U]    c #35D2D2",
-"V]    c #32C7C9",
-"W]    c #3DE5E4",
-"X]    c #41EFEC",
-"Y]    c #32C8CA",
-"Z]    c #2EBABE",
-"`]    c #3BE0DF",
-" ^    c #40EEEC",
-".^    c #25ACAF",
-"+^    c #39DBDA",
-"@^    c #41EEEA",
-"#^    c #40EDEB",
-"$^    c #39D9DA",
-"%^    c #2BAEB1",
-"&^    c #31C4C6",
-"*^    c #3EE5E3",
-"=^    c #42F0ED",
-"-^    c #42F2EE",
-";^    c #43F2EE",
-">^    c #3EE8E6",
-",^    c #28A1A6",
-"'^    c #35CFD1",
-")^    c #3FE9E7",
-"!^    c #43F1EF",
-"~^    c #42F2EF",
-"{^    c #41EFED",
-"]^    c #3CE3E0",
-"^^    c #30BDC0",
-"/^    c #32C6C8",
-"(^    c #3EE7E4",
-"_^    c #30BCBF",
-":^    c #3DE3E1",
-"<^    c #44F1EE",
-"[^    c #45F4F0",
-"}^    c #43F3EF",
-"|^    c #44F4F0",
-"1^    c #44F3F0",
-"2^    c #43F2F0",
-"3^    c #37D4D4",
-"4^    c #279DA1",
-"5^    c #35CECF",
-"6^    c #40EBE7",
-"7^    c #43F3F0",
-"8^    c #3DE5E2",
-"9^    c #32C3C5",
-"0^    c #2BADB1",
-"a^    c #3AD9D9",
-"b^    c #42EFEC",
-"c^    c #44F3EF",
-"d^    c #3ADDDC",
-"e^    c #2EB4B7",
-"f^    c #27A0A4",
-"g^    c #36D2D1",
-"h^    c #41ECE9",
-"i^    c #44F2EF",
-"j^    c #45F3F0",
-"k^    c #34C8CA",
-"l^    c #40E8E6",
-"m^    c #46F5F0",
-"n^    c #47F6F1",
-"o^    c #46F5F1",
-"p^    c #47F5F1",
-"q^    c #45F5F0",
-"r^    c #45F5F1",
-"s^    c #45F4F1",
-"t^    c #46F4F1",
-"u^    c #41EBE8",
-"v^    c #36CCCD",
-"w^    c #2BAAAD",
-"x^    c #3BD9D8",
-"y^    c #44EFEC",
-"z^    c #3EE3E1",
-"A^    c #30BBBD",
-"B^    c #30BABD",
-"C^    c #3EE3E2",
-"D^    c #46F3F0",
-"E^    c #47F5F0",
-"F^    c #46F4F0",
-"G^    c #39D8D8",
-"H^    c #2CADB0",
-"I^    c #3AD9DA",
-"J^    c #43F0EC",
-"K^    c #2AA1A4",
-"L^    c #38D1D2",
-"M^    c #42EDE9",
-"N^    c #47F5F2",
-"O^    c #47F6F2",
-"P^    c #48F5F1",
-"Q^    c #40E7E5",
-"R^    c #34C4C6",
-"S^    c #30B6B9",
-"T^    c #3DDFDD",
-"U^    c #44F1ED",
-"V^    c #48F5F2",
-"W^    c #45F2EE",
-"X^    c #3CDEDC",
-"Y^    c #2EB1B5",
-"Z^    c #34C4C7",
-"`^    c #40E8E5",
-" /    c #48F6F2",
-"./    c #48F6F1",
-"+/    c #43EDEA",
-"@/    c #30B8BC",
-"#/    c #3EE1E0",
-"$/    c #44F2EE",
-"%/    c #46F5F2",
-"&/    c #3BDBDA",
-"*/    c #45F1ED",
-"=/    c #49F7F2",
-"-/    c #4AF7F2",
-";/    c #49F7F1",
-">/    c #49F6F2",
-",/    c #46F3EF",
-"'/    c #3FE2E0",
-")/    c #31BBBD",
-"!/    c #33C1C3",
-"~/    c #3FE5E2",
-"{/    c #47F3EF",
-"]/    c #45F2EC",
-"^/    c #3AD6D7",
-"//    c #38CECF",
-"(/    c #43EDE9",
-"_/    c #49F6F1",
-":/    c #49F7F3",
-"</    c #48F7F2",
-"[/    c #47F4F1",
-"}/    c #42EAE6",
-"|/    c #36C9CA",
-"1/    c #33C2C4",
-"2/    c #40E7E3",
-"3/    c #47F3F0",
-"4/    c #32B9BD",
-"5/    c #40E3E1",
-"6/    c #47F4EF",
-"7/    c #4CF8F3",
-"8/    c #4BF8F3",
-"9/    c #4BF7F2",
-"0/    c #4DF8F3",
-"a/    c #49F6F3",
-"b/    c #4BF7F3",
-"c/    c #4BF8F2",
-"d/    c #46F1ED",
-"e/    c #3EDDDC",
-"f/    c #2FB1B3",
-"g/    c #36CACC",
-"h/    c #44EDE9",
-"i/    c #4CF7F2",
-"j/    c #45EEEB",
-"k/    c #38CFCF",
-"l/    c #2CA9AB",
-"m/    c #3AD9D7",
-"n/    c #46F1EC",
-"o/    c #4CF7F3",
-"p/    c #49F6F0",
-"q/    c #42E7E4",
-"r/    c #34C2C3",
-"s/    c #38CCCD",
-"t/    c #4AF6F1",
-"u/    c #36C5C6",
-"v/    c #42E9E5",
-"w/    c #4FF8F3",
-"x/    c #50F8F4",
-"y/    c #4FF8F4",
-"z/    c #4EF8F3",
-"A/    c #4DF7F4",
-"B/    c #47F1ED",
-"C/    c #3AD7D6",
-"D/    c #2CA3A6",
-"E/    c #3BD6D5",
-"F/    c #45F1EC",
-"G/    c #4DF7F3",
-"H/    c #4EF8F4",
-"I/    c #50F9F4",
-"J/    c #4CF6F2",
-"K/    c #43E9E5",
-"L/    c #35C5C7",
-"M/    c #30B5B7",
-"N/    c #3FE0DF",
-"O/    c #49F4F0",
-"P/    c #4BF5F0",
-"Q/    c #40E2DF",
-"R/    c #30B7B9",
-"S/    c #2CA6A9",
-"T/    c #4DF8F2",
-"U/    c #39CFCF",
-"V/    c #46EFEA",
-"W/    c #4EF7F2",
-"X/    c #52F9F5",
-"Y/    c #52F8F4",
-"Z/    c #53F9F5",
-"`/    c #51F8F4",
-" (    c #51F9F5",
-".(    c #50F8F3",
-"+(    c #3AD0D0",
-"@(    c #2FB2B3",
-"#(    c #3FDFDD",
-"$(    c #49F4EF",
-"%(    c #52F9F4",
-"&(    c #51F8F5",
-"*(    c #4CF6F1",
-"=(    c #33BEBF",
-"-(    c #34C0C2",
-";(    c #42E8E4",
-">(    c #4DF6F2",
-",(    c #50F9F3",
-"'(    c #49F3EF",
-")(    c #3CDBDA",
-"!(    c #30B3B6",
-"~(    c #40E1E0",
-"{(    c #2DA9AC",
-"](    c #3EDAD8",
-"^(    c #4BF3EE",
-"/(    c #54FBF5",
-"((    c #54FAF5",
-"_(    c #55FAF5",
-":(    c #53FAF5",
-"<(    c #54F9F5",
-"[(    c #56FAF5",
-"}(    c #55F9F5",
-"|(    c #45ECE8",
-"1(    c #37C8C9",
-"2(    c #33BDC0",
-"3(    c #43E7E3",
-"4(    c #4EF6F2",
-"5(    c #4CF5F1",
-"6(    c #40E1DD",
-"7(    c #38CBCC",
-"8(    c #46EEE9",
-"9(    c #56FBF5",
-"0(    c #55FAF6",
-"a(    c #47F1EE",
-"b(    c #3BD5D5",
-"c(    c #35C0C2",
-"d(    c #44E8E6",
-"e(    c #4FF7F2",
-"f(    c #32B4B6",
-"g(    c #41E2DF",
-"h(    c #50F7F2",
-"i(    c #58FBF6",
-"j(    c #56FBF6",
-"k(    c #58FAF5",
-"l(    c #57FBF6",
-"m(    c #56F9F5",
-"n(    c #57FAF5",
-"o(    c #56FAF6",
-"p(    c #58FBF5",
-"q(    c #52F7F3",
-"r(    c #44E7E4",
-"s(    c #34BEBF",
-"t(    c #38C9CA",
-"u(    c #45EDE8",
-"v(    c #53F9F3",
-"w(    c #57FAF6",
-"x(    c #58FAF6",
-"y(    c #57FBF5",
-"z(    c #4CF3EE",
-"A(    c #3EDAD9",
-"B(    c #3CD6D4",
-"C(    c #53F9F4",
-"D(    c #48EFEA",
-"E(    c #39CECE",
-"F(    c #39CCCD",
-"G(    c #47EFEA",
-"H(    c #35C0C1",
-"I(    c #46E9E5",
-"J(    c #53F8F3",
-"K(    c #59FBF5",
-"L(    c #59FBF6",
-"M(    c #5AFBF6",
-"N(    c #5AFBF7",
-"O(    c #5BFCF7",
-"P(    c #5BFBF6",
-"Q(    c #58FBF7",
-"R(    c #52F8F2",
-"S(    c #40E1DF",
-"T(    c #3CD4D2",
-"U(    c #4DF1ED",
-"V(    c #5AFCF7",
-"W(    c #59FBF7",
-"X(    c #59FCF7",
-"Y(    c #59FAF5",
-"Z(    c #4DF2ED",
-"`(    c #3BD3D2",
-" _    c #30AFB2",
-"._    c #40DFDD",
-"+_    c #51F6F1",
-"@_    c #5BFBF7",
-"#_    c #55F9F4",
-"$_    c #46EBE7",
-"%_    c #36C3C5",
-"&_    c #3CD5D4",
-"*_    c #4EF3EF",
-"=_    c #39CDCC",
-"-_    c #4AEFEB",
-";_    c #5DFCF8",
-">_    c #5CFCF7",
-",_    c #5EFCF8",
-"'_    c #5CFCF8",
-")_    c #5FFCF8",
-"!_    c #60FDF8",
-"~_    c #4FF4F0",
-"{_    c #3FDBD9",
-"]_    c #2FAAAE",
-"^_    c #3FDCDA",
-"/_    c #4FF4EF",
-"(_    c #5EFCF7",
-"__    c #5EFDF8",
-":_    c #4BEFEA",
-"<_    c #39CBCC",
-"[_    c #34BCBE",
-"}_    c #45E8E4",
-"|_    c #56F9F4",
-"1_    c #5DFCF7",
-"2_    c #5DFDF7",
-"3_    c #54F9F3",
-"4_    c #45E5E1",
-"5_    c #34BABB",
-"6_    c #30AEB0",
-"7_    c #41DFDD",
-"8_    c #51F5F1",
-"9_    c #3ED7D6",
-"0_    c #50F4EF",
-"a_    c #5CFBF7",
-"b_    c #61FDF8",
-"c_    c #62FDF8",
-"d_    c #5FFDF8",
-"e_    c #60FCF8",
-"f_    c #4CF1EC",
-"g_    c #3BD2D1",
-"h_    c #33B7B9",
-"i_    c #56F8F4",
-"j_    c #5BFAF5",
-"k_    c #48EAE6",
-"l_    c #35BFC1",
-"m_    c #39C9C9",
-"n_    c #49EDEA",
-"o_    c #5CFAF5",
-"p_    c #61FCF8",
-"q_    c #5CFBF6",
-"r_    c #54F7F2",
-"s_    c #42DFDD",
-"t_    c #32B9BA",
-"u_    c #45E5E2",
-"v_    c #58F9F4",
-"w_    c #31AFB1",
-"x_    c #43E1DF",
-"y_    c #55F8F3",
-"z_    c #64FDF8",
-"A_    c #62FEF8",
-"B_    c #63FEF9",
-"C_    c #63FEF8",
-"D_    c #63FDF9",
-"E_    c #63FDF8",
-"F_    c #64FEF9",
-"G_    c #5CFBF5",
-"H_    c #4CEFEA",
-"I_    c #3ACAC9",
-"J_    c #37C3C4",
-"K_    c #48EBE7",
-"L_    c #5BFAF6",
-"M_    c #62FDF9",
-"N_    c #62FEF9",
-"O_    c #57F9F4",
-"P_    c #44E3E1",
-"Q_    c #4FF3EE",
-"R_    c #5EFBF6",
-"S_    c #64FEF8",
-"T_    c #53F5F0",
-"U_    c #3FD8D6",
-"V_    c #34C3C3",
-"W_    c #4AEEE9",
-"X_    c #5FFCF6",
-"Y_    c #35BCBD",
-"Z_    c #47E8E5",
-"`_    c #5DFAF4",
-" :    c #68FEF9",
-".:    c #66FEF9",
-"+:    c #65FEF9",
-"@:    c #67FEF9",
-"#:    c #65FDF9",
-"$:    c #65FEF8",
-"%:    c #66FEF8",
-"&:    c #63FCF8",
-"*:    c #69FEF9",
-"=:    c #64FDF9",
-"-:    c #5FFBF5",
-";:    c #48EAE5",
-">:    c #36C0C0",
-",:    c #3BD0CF",
-"':    c #51F2EE",
-"):    c #62FCF7",
-"!:    c #68FEF8",
-"~:    c #65FDF8",
-"{:    c #57F7F2",
-"]:    c #30A9AD",
-"^:    c #41DEDB",
-"/:    c #59F7F1",
-"(:    c #62FCF8",
-"_:    c #66FDF9",
-"::    c #66FDF8",
-"<:    c #62FBF6",
-"[:    c #4EF1ED",
-"}:    c #38CECE",
-"|:    c #53F3ED",
-"1:    c #64FCF7",
-"2:    c #3BC9C8",
-"3:    c #55EFEA",
-"4:    c #6BFCF7",
-"5:    c #76FFFA",
-"6:    c #72FFFA",
-"7:    c #6BFEF9",
-"8:    c #72FEF9",
-"9:    c #74FFFA",
-"0:    c #6EFEF9",
-"a:    c #6BFFFA",
-"b:    c #6DFEFA",
-"c:    c #70FFF9",
-"d:    c #70FFFA",
-"e:    c #6CFEF9",
-"f:    c #71FEFA",
-"g:    c #74FEFA",
-"h:    c #6EFFFA",
-"i:    c #75FEF9",
-"j:    c #73FFFA",
-"k:    c #74FFF9",
-"l:    c #63FAF5",
-"m:    c #48E5E2",
-"n:    c #46DCDA",
-"o:    c #5FF7F2",
-"p:    c #6AFEF9",
-"q:    c #71FFFA",
-"r:    c #6FFEF9",
-"s:    c #6CFFF9",
-"t:    c #6EFFF9",
-"u:    c #71FEF9",
-"v:    c #70FEF9",
-"w:    c #6DFFF9",
-"x:    c #70FEFA",
-"y:    c #6CFFFA",
-"z:    c #6AFEFA",
-"A:    c #6EFDF8",
-"B:    c #5DF5EF",
-"C:    c #42D6D3",
-"D:    c #35B7B9",
-"E:    c #4EE7E2",
-"F:    c #60F9F4",
-"G:    c #76FEFA",
-"H:    c #72FEFA",
-"I:    c #6FFEFA",
-"J:    c #6DFEF9",
-"K:    c #6FFFFA",
-"L:    c #68FDF6",
-"M:    c #53EEEA",
-"N:    c #39C6C6",
-"O:    c #1D9A9D",
-"P:    c #48DFDB",
-"Q:    c #64F9F3",
-"R:    c #41D4D1",
-"S:    c #66F3EE",
-"T:    c #77FEF8",
-"U:    c #79FFFA",
-"V:    c #78FFFA",
-"W:    c #77FFFA",
-"X:    c #77FFF9",
-"Y:    c #7AFFFA",
-"Z:    c #75FFFA",
-"`:    c #76FEF9",
-" <    c #78FEF9",
-".<    c #6AF8F2",
-"+<    c #4BDEDB",
-"@<    c #35B3B4",
-"#<    c #50E4E0",
-"$<    c #6CFAF4",
-"%<    c #75FEFA",
-"&<    c #77FEF9",
-"*<    c #76FEF8",
-"=<    c #5FF1EB",
-"-<    c #3DCDCB",
-";<    c #3CC5C4",
-"><    c #5AEDE8",
-",<    c #75FCF6",
-"'<    c #7BFFFA",
-")<    c #78FFF9",
-"!<    c #6FFCF6",
-"~<    c #56EAE5",
-"{<    c #20A6A7",
-"]<    c #57E9E4",
-"^<    c #33AAAB",
-"/<    c #4CDDD9",
-"(<    c #6BF7F1",
-"_<    c #73FEF9",
-":<    c #7CFFFA",
-"<<    c #7EFFFA",
-"[<    c #7DFFFA",
-"}<    c #7DFEF8",
-"|<    c #6BF5EF",
-"1<    c #47D6D3",
-"2<    c #3ABFBE",
-"3<    c #5EEBE5",
-"4<    c #78FCF5",
-"5<    c #7AFEF9",
-"6<    c #74FCF5",
-"7<    c #5BECE7",
-"8<    c #39C2C1",
-"9<    c #45CFCC",
-"0<    c #5EF1EC",
-"a<    c #7FFFFA",
-"b<    c #76FFF9",
-"c<    c #72FAF4",
-"d<    c #52E4DE",
-"e<    c #28B9B8",
-"f<    c #3AB6B4",
-"g<    c #5EE6E0",
-"h<    c #7CFAF4",
-"i<    c #82FEF9",
-"j<    c #84FFFA",
-"k<    c #81FFFA",
-"l<    c #85FFFA",
-"m<    c #82FFFA",
-"n<    c #83FFFA",
-"o<    c #80FFFA",
-"p<    c #83FEF9",
-"q<    c #6BF1EB",
-"r<    c #44CCCA",
-"s<    c #42CCC9",
-"t<    c #68EFEA",
-"u<    c #80FDF7",
-"v<    c #82FFF9",
-"w<    c #7AFAF4",
-"x<    c #61E7E2",
-"y<    c #50DAD6",
-"z<    c #78F7F1",
-"A<    c #81FEF9",
-"B<    c #81FFF9",
-"C<    c #76F7F2",
-"D<    c #53DCD8",
-"E<    c #45C4C2",
-"F<    c #6AEDE8",
-"G<    c #86FCF7",
-"H<    c #8DFFFA",
-"I<    c #87FFFA",
-"J<    c #8BFFFA",
-"K<    c #88FFFA",
-"L<    c #8AFFFA",
-"M<    c #89FFFA",
-"N<    c #8CFFFA",
-"O<    c #83FCF6",
-"P<    c #70ECE6",
-"Q<    c #44C2C0",
-"R<    c #55D6D2",
-"S<    c #7CF4EF",
-"T<    c #8AFDF9",
-"U<    c #8FFFFA",
-"V<    c #8CFEF9",
-"W<    c #80F9F4",
-"X<    c #59E0DC",
-"Y<    c #3BB1B1",
-"Z<    c #5FE3DE",
-"`<    c #84FAF5",
-" [    c #86FFFA",
-".[    c #8EFFFA",
-"+[    c #8AFFFB",
-"@[    c #87FEF8",
-"#[    c #76F3ED",
-"$[    c #4BD1CE",
-"%[    c #4FD0CD",
-"&[    c #75F3ED",
-"*[    c #84FEF9",
-"=[    c #86FAF4",
-"-[    c #61E5DF",
-";[    c #3AACAB",
-">[    c #59E0DB",
-",[    c #7FF8F2",
-"'[    c #85FEF9",
-")[    c #7CF6F0",
-"![    c #56D8D4",
-"~[    c #44BEBD",
-"{[    c #69EBE5",
-"][    c #85FCF6",
-"^[    c #87FFFB",
-"/[    c #7FFCF8",
-"([    c #74EEE8",
-"_[    c #44C6C5",
-":[    c #57DAD6",
-"<[    c #83F6F1",
-"[[    c #88FEF9",
-"}[    c #90FFFA",
-"|[    c #94FFFA",
-"1[    c #92FFFB",
-"2[    c #91FFFA",
-"3[    c #83F7F1",
-"4[    c #59DED9",
-"5[    c #41B9B8",
-"6[    c #70E8E2",
-"7[    c #88FBF5",
-"8[    c #93FFFA",
-"9[    c #92FFFA",
-"0[    c #8EFEF8",
-"a[    c #74F1EC",
-"b[    c #4CCEC9",
-"c[    c #47CCC8",
-"d[    c #79F1EB",
-"e[    c #8DFDF8",
-"f[    c #90FFFB",
-"g[    c #86FFF9",
-"h[    c #87FBF5",
-"i[    c #6BE9E4",
-"j[    c #40B1AF",
-"k[    c #71E4DE",
-"l[    c #8EFAF4",
-"m[    c #98FFFA",
-"n[    c #96FFFA",
-"o[    c #98FFFB",
-"p[    c #95FFFA",
-"q[    c #9AFFFA",
-"r[    c #97FFFA",
-"s[    c #99FFFB",
-"t[    c #96FFFB",
-"u[    c #95FFFB",
-"v[    c #96FEF8",
-"w[    c #8AF5EF",
-"x[    c #5DD7D2",
-"y[    c #4EC6C2",
-"z[    c #80EFE8",
-"A[    c #95FEF8",
-"B[    c #97FFFB",
-"C[    c #99FFFA",
-"D[    c #9AFFFB",
-"E[    c #92FDF8",
-"F[    c #7EEDE7",
-"G[    c #4BC2C0",
-"H[    c #61D7D1",
-"I[    c #83F6EF",
-"J[    c #91FEF8",
-"K[    c #94FFFB",
-"L[    c #91FAF4",
-"M[    c #72E5DF",
-"N[    c #4CBEBC",
-"O[    c #7BEAE3",
-"P[    c #94FCF6",
-"Q[    c #9CFFFA",
-"R[    c #9CFFFB",
-"S[    c #9BFFFB",
-"T[    c #9EFFFB",
-"U[    c #9EFFFA",
-"V[    c #9DFFFB",
-"W[    c #9BFFFA",
-"X[    c #93FDF7",
-"Y[    c #86F2EB",
-"Z[    c #5BCFCB",
-"`[    c #60D3CE",
-" }    c #86F4ED",
-".}    c #94FFF9",
-"+}    c #98FBF5",
-"@}    c #75E7E1",
-"#}    c #6BDFD9",
-"$}    c #90F7F2",
-"%}    c #9BFEFA",
-"&}    c #9FFFFB",
-"*}    c #90F7F1",
-"=}    c #68DDD7",
-"-}    c #57C9C4",
-";}    c #88F0E9",
-">}    c #9AFDF7",
-",}    c #9FFFFA",
-"'}    c #A0FFFB",
-")}    c #A1FFFB",
-"!}    c #9BFDF8",
-"~}    c #85EEE8",
-"{}    c #66DCD7",
-"]}    c #90F8F1",
-"^}    c #95F9F2",
-"/}    c #73E1DC",
-"(}    c #48B8B5",
-"_}    c #7EE6E0",
-":}    c #97FBF5",
-"<}    c #9FFEFA",
-"[}    c #A0FFFA",
-"}}    c #9DFFFA",
-"|}    c #9DFEF9",
-"1}    c #8FF5EF",
-"2}    c #63D4CE",
-"3}    c #61D3CE",
-"4}    c #91F3ED",
-"5}    c #9EFDF8",
-"6}    c #A1FFFA",
-"7}    c #A3FFFB",
-"8}    c #A4FFFB",
-"9}    c #A2FFFB",
-"0}    c #A3FFFA",
-"a}    c #A2FFFA",
-"b}    c #9BFBF6",
-"c}    c #80E8E2",
-"d}    c #46B2B0",
-"e}    c #79E5DE",
-"f}    c #99FAF4",
-"g}    c #A0FEFA",
-"h}    c #9FFEF9",
-"i}    c #93F6EF",
-"j}    c #69D9D3",
-"k}    c #55C5C0",
-"l}    c #85EDE6",
-"m}    c #9AFCF6",
-"n}    c #9CFEF8",
-"o}    c #57C9C5",
-"p}    c #76DDD7",
-"q}    c #9CF8F3",
-"r}    c #A8FFFB",
-"s}    c #A7FFFB",
-"t}    c #A6FFFB",
-"u}    c #A5FFFB",
-"v}    c #A9FFFB",
-"w}    c #A7FFFA",
-"x}    c #9BF9F3",
-"y}    c #77DFD9",
-"z}    c #55C0BB",
-"A}    c #8AEBE4",
-"B}    c #A1FCF6",
-"C}    c #A6FFFA",
-"D}    c #A4FFFA",
-"E}    c #A2FDF8",
-"F}    c #91F2EB",
-"G}    c #67D0C9",
-"H}    c #63CFC9",
-"I}    c #94F2EB",
-"J}    c #A4FEF9",
-"K}    c #97FCF6",
-"L}    c #88EAE2",
-"M}    c #4AB6B2",
-"N}    c #87E7E1",
-"O}    c #A1FCF5",
-"P}    c #ABFFFC",
-"Q}    c #ABFFFB",
-"R}    c #AAFFFB",
-"S}    c #ACFFFC",
-"T}    c #AAFFFC",
-"U}    c #A9FFFC",
-"V}    c #A4FFF9",
-"W}    c #94F5EF",
-"X}    c #6FD6D0",
-"Y}    c #64CDC7",
-"Z}    c #93F1EA",
-"`}    c #A2FEF8",
-" |    c #ADFFFC",
-".|    c #ACFFFB",
-"+|    c #A7FDF7",
-"@|    c #8EEDE7",
-"#|    c #5FC5BF",
-"$|    c #74DAD4",
-"%|    c #9EF8F1",
-"&|    c #A8FFFC",
-"*|    c #9FFAF4",
-"=|    c #84E2DC",
-"-|    c #5EC3BF",
-";|    c #94EEE8",
-">|    c #A9FEF7",
-",|    c #ADFFFB",
-"'|    c #AEFFFB",
-")|    c #AEFFFC",
-"!|    c #A9FDF9",
-"~|    c #9AF1EA",
-"{|    c #67CEC8",
-"]|    c #73D6D0",
-"^|    c #9DF5EF",
-"/|    c #A9FFFA",
-"(|    c #A6FCF6",
-"_|    c #89E8E1",
-":|    c #80E4DD",
-"<|    c #A0FAF3",
-"[|    c #AAFFFA",
-"}|    c #9DF7F1",
-"||    c #7FDCD5",
-"1|    c #6DCFCA",
-"2|    c #9DF3EC",
-"3|    c #ABFDF8",
-"4|    c #B0FFFC",
-"5|    c #AFFFFB",
-"6|    c #B1FFFB",
-"7|    c #AFFFFC",
-"8|    c #B2FFFC",
-"9|    c #B1FFFC",
-"0|    c #AAFCF7",
-"a|    c #95ECE6",
-"b|    c #88DFD8",
-"c|    c #A4F9F2",
-"d|    c #AEFFFA",
-"e|    c #B0FFFB",
-"f|    c #B2FFFB",
-"g|    c #A6F9F3",
-"h|    c #80E1DA",
-"i|    c #58BEB8",
-"j|    c #91EBE3",
-"k|    c #ACFFFA",
-"l|    c #9CF4ED",
-"m|    c #75D3CD",
-"n|    c #77D9D3",
-"o|    c #A1F6EF",
-"p|    c #ACFEF9",
-"q|    c #B3FFFC",
-"r|    c #B4FFFC",
-"s|    c #A8FBF5",
-"t|    c #8EE7E1",
-"u|    c #59B7B3",
-"v|    c #90E6E0",
-"w|    c #A9FCF6",
-"x|    c #ABFFFA",
-"y|    c #A7F7F0",
-"z|    c #78D8D1",
-"A|    c #6FC9C3",
-"B|    c #97F1EA",
-"C|    c #A9FDF7",
-"D|    c #B3FEFC",
-"E|    c #B3FFFB",
-"F|    c #A9FEF8",
-"G|    c #98F0E9",
-"H|    c #66CAC5",
-"I|    c #8BE1DB",
-"J|    c #A8FAF3",
-"K|    c #B6FEFA",
-"L|    c #B4FFFB",
-"M|    c #B5FFFC",
-"N|    c #B5FFFB",
-"O|    c #B6FFFC",
-"P|    c #B9FFFC",
-"Q|    c #B7FFFC",
-"R|    c #B2FEFA",
-"S|    c #AAF9F3",
-"T|    c #8AE0DA",
-"U|    c #65C5BF",
-"V|    c #9CEFE6",
-"W|    c #B0FDF7",
-"X|    c #B3FEFA",
-"Y|    c #A2F2EB",
-"Z|    c #74CEC7",
-"`|    c #79D4CD",
-" 1    c #A0F4ED",
-".1    c #B2FDF9",
-"+1    c #B8FFFC",
-"@1    c #AFFCF6",
-"#1    c #96EBE4",
-"$1    c #60BAB6",
-"%1    c #93E8E1",
-"&1    c #AEFBF5",
-"*1    c #B5FEFA",
-"=1    c #A3F6EF",
-"-1    c #7AD7D1",
-";1    c #73CFC9",
-">1    c #A2F3EC",
-",1    c #B4FEF8",
-"'1    c #AFFCF7",
-")1    c #9BECE5",
-"!1    c #88DED5",
-"~1    c #A3F7F0",
-"{1    c #B2FEF9",
-"]1    c #A9FAF4",
-"^1    c #8FE4DD",
-"/1    c #6DC6C0",
-"(1    c #9FEEE7",
-"_1    c #B2FDF7",
-":1    c #BAFFFC",
-"<1    c #B9FFFB",
-"[1    c #B6FEF9",
-"}1    c #A6F1E9",
-"|1    c #74CDC7",
-"11    c #85DAD3",
-"21    c #ACF7F0",
-"31    c #B7FEFA",
-"41    c #B6FFFB",
-"51    c #B1FAF4",
-"61    c #95E6DF",
-"71    c #61B6B2",
-"81    c #94E5DE",
-"91    c #AFFBF4",
-"01    c #B4FEFA",
-"a1    c #A8F8F1",
-"b1    c #86DCD4",
-"c1    c #7FD3CC",
-"d1    c #A9F2EC",
-"e1    c #BCFFFC",
-"f1    c #BBFFFC",
-"g1    c #B8FFFB",
-"h1    c #B6FCF6",
-"i1    c #9FEBE4",
-"j1    c #8FE3DB",
-"k1    c #B1FAF3",
-"l1    c #BAFEFA",
-"m1    c #BDFFFC",
-"n1    c #AFF8F2",
-"o1    c #91E0D8",
-"p1    c #6FC3BB",
-"q1    c #A0ECE5",
-"r1    c #B7FDF7",
-"s1    c #BAFFFB",
-"t1    c #B8FFF9",
-"u1    c #AAF4EC",
-"v1    c #80D2CB",
-"w1    c #89D6CF",
-"x1    c #ACF4ED",
-"y1    c #BCFEFA",
-"z1    c #BEFFFC",
-"A1    c #BFFFFC",
-"B1    c #BEFFFB",
-"C1    c #B8FBF6",
-"D1    c #9EE7E0",
-"E1    c #64B7B1",
-"F1    c #9AE5DE",
-"G1    c #B5FAF3",
-"H1    c #BBFFFA",
-"I1    c #B9FEFA",
-"J1    c #AFF7F0",
-"K1    c #8DDAD3",
-"L1    c #77C8C1",
-"M1    c #A6EFE8",
-"N1    c #B6FCF7",
-"O1    c #BBFDF9",
-"P1    c #A8F0E9",
-"Q1    c #7CCDC5",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
-"                                                                                          .                                                                                                                                                                                                                                                                                                                                                                                                                                     ",
-"                                                                                          + @                                                                                                                                                                                                                                                                                                                                                                                                                                   ",
-"                                                                                          # $ %                                                                                                                                                                                                                                                                                                                                                                                                                                 ",
-"                                                                                          & * =                                                                                                                                                                                                                                                                                                                                                                                                                                 ",
-"                                                                                          - ; > ,                                                                                                                                                                                                                                                                                                                                                                                                                               ",
-"                                                                                        ' ) ! ~ { *                                                                                                                                                                                                                                                                                                                                                                                                                             ",
-"                                                                                        ] ^ / ( _ : <                                                                                                                                                                                                                                                                                                                                                                                                                           ",
-"                                                                                        [ } > | | ~ 1 2                                                                                                                                                                                                                                                                                                                                                                                                                         ",
-"                                                                                        @ 3 _ | | | 4 ;                                                                                                                                                                                                                                                                                                                                                                                                                         ",
-"                                                                                        5 , 4 | | | 6 7 8                                                                                                                                                                                                                                                                                                                                                                                                                       ",
-"                                                                                        9 ; 0 a a a a a ( ,                                                                                                                                                                                                                                                                                                                                                                                                                     ",
-"                                                                                        b c 6 a a a a a 6 d *                                                                                                                                                                                                                                                                                                                                                                                                                   ",
-"                                                                                        e { a f f f f f g h { i                                                                                       j [ k 5 5 @ l                                                                                                                                                                                                                                                                                                             ",
-"                                                                                      m n o a g g g f f f f 6 :                                                                                         5 < p q r s t u % v w k x [                                                                                                                                                                                                                                                                                             ",
-"                                                                                      y z ( A B C A A A A A D 6 /                                                                                         E d | | F ~ G d : c H , p z I t % J K L x                                                                                                                                                                                                                                                                             ",
-"                                                                                      @ = | C A A A A A A A A D 6 1                                                                                         1 M N C D g D f f h 6 O 4 _ o G / 1 P = * Q < $ R w k 5 @                                                                                                                                                                                                                                                           ",
-"                                                                                      5 8 S A A T A A T T A A A A ( U                                                                                       e : S C A A T A A T V T V A g g B a 6 | W ( ~ d X ! 1 Y Z * t                                                                                                                                                                                                                                                       ",
-"                                                                                      ` 1 B  .T T ..T T T  .T T ..C ~                                                                                         I o D ..T ....+.V +.T T T  .....@...T T A A #.A D B f h $.d p                                                                                                                                                                                                                                                     ",
-"                                                                                      % > %.&.@. .*. . .@.=. . .*.-.;.>.                                                                                        ,.0 +.*.*.*.*...*.@. . .*.*.@.*.*. .*. .*.&.&.@.*. .@...#.( '.                                                                                                                                                                                                                                                  ",
-"                                                                                      ).>.+.*.*.*.*.*.*.*.*.*.*.*.*.-.!.~.                                                                                        {.6 +.*.*.*.*.&.].*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.C ^.                                                                                                                                                                                                                                                  ",
-"                                                                                      < O @././././.(.(._./.(./.(.(./.].:./                                                                                         { D ].(./.(./.(./.(.(./.(./.(.(.(.(./.(._.(.(.(.(.(./.].C <.                                                                                                                                                                                                                                                ",
-"                                                                                      Q 6 [./././.(./.(././.(.(./.(./.(.[.h 1                                                                                       z ~ T ]././.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(.(.(.(.(.(.].B :                                                                                         }.                                                                                                                                                    ",
-"                                                                                    |.Z f (._.1.1._.2._.2.1._.1.1._.1._._.@.6                                                                                         U 6 @.1.1.1.1.2._.1._._.1.1.1.1.1._.1._._._.2.1.1.1.1.1.&.f 3.                                                                                      y - I z ^ $ $ J w                                                                                                                                     ",
-"                                                                                    4.5.C 2.1.2.6._.1.2._.1.1._.6.2.2.2._.1.7.~                                                                                         ; f (.6.2._.2._.1.1.8.2.6.1.2.2.1.6.1.6.6.2.1.6._.2.2.1.].9.P                                                                                       e / $.h ( o G 3.8 P p Q I t % 9 &                                                                                                                   ",
-"                                                                                    ` : @.0.a.a.0.2.a.a.2.b.6.b.0.0.b.a.2.a.a.+.4                                                                                         { T a.a.2.0.c.a.d.6.0.0.b.a.6.d.a.6.a.0.d.a.0.b.6.0.6.b.].|                                                                                         ; g (.(.[.e.@.+.T D f.h W g.{ ! P 8 = Q i e h.w i.                                                                                                ",
-"                                                                                    - j.].k.l.a.0.k.k.k.0.k.a.a.a.k.a.0.k.k.m.b...d                                                                                         4 ].a.m.k.0.m.k.a.a.m.0.a.0.k.k.0.a.a.k.a.a.k.m.m.0.k.k.&.(                                                                                         d T 6.m.a.k.a.6.0.6.6././.e. .7.T n.a O ^.d X : 1 ,.3 n $ R                                                                                     ",
-"                                                                                    $ ( _.m.k.k.a.m.k.k.m.k.m.k.k.k.m.k.m.0.m.k.6.A !                                                                                       = a 1.k.k.k.m.m.k.k.m.m.k.m.0.k.m.k.a.m.k.0.k.k.m.k.m.m.0.o.j.                                                                                        _ ].k.0.m.k.0.m.k.p.k.m.m.k.k.k.a.6.6._.(.].*...A D h O _ 3.                                                                                  ",
-"                                                                                    I h q.r.s.r.t.k.r.r.m.m.u.m.u.u.r.m.m.m.u.s.u.b.D                                                                                         ; D 1.r.m.u.t.m.r.u.u.v.k.k.r.r.r.r.m.u.u.m.k.u.m.k.r.r.k. .>                                                                                       U h (.k.r.m.u.m.m.u.m.k.r.m.r.u.r.s.u.t.u.k.m.m.m.0.0.2.8...d                                                                                 ",
-"                                                                                    Q B q.t.t.r.u.u.u.u.t.u.u.t.r.r.t.r.u.u.u.u.t.u.2.f.                                                                                        {  .m.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.r.r.u.u.u.r.w.#.                                                                                        1 C 0.u.t.r.u.r.u.t.r.u.u.u.u.r.u.u.u.u.t.u.u.u.u.u.u.u.q. .{                                                                               ",
-"                                                                                    P C s.u.v.t.r.t.t.t.u.u.u.u.u.u.t.r.u.u.u.u.r.u.r.x.(                                                                                         ^.x.m.t.u.t.u.u.u.t.u.r.t.u.t.u.r.t.u.t.u.u.u.t.r.u.u.s.c.f                                                                                         >  .m.t.t.u.r.u.u.u.u.u.u.u.r.t.u.r.u.u.u.u.t.t.u.u.u.t.0.#.                                                                              ",
-"                                                                                  k ! ..y.t.t.z.t.A.t.A.z.B.t.t.t.t.t.t.t.t.z.t.C.t.B.t.].~                                                                                         f.b.D.B.t.t.t.t.B.t.t.z.t.A.t.t.E.B.A.B.z.t.z.t.t.t.B.t.8.0                                                                                         ~ (.v.z.u.B.z.B.z.z.t.z.t.t.t.t.t.t.t.t.t.A.A.B.u.z.z.F.0.n.                                                                            ",
-"                                                                                  ` d 8.z.G.G.H.G.A.z.G.E.A.H.z.z.H.H.G.z.z.H.G.G.G.H.G.v...{                                                                                       H V 0.I.H.z.H.H.H.z.z.E.G.G.z.G.G.H.A.z.H.G.A.H.G.z.H.H.A._.~                                                                                         f.0.z.B.H.H.H.z.E.G.z.H.H.z.H.G.H.z.z.G.G.H.A.G.H.H.G.B.0.J.                                                                          ",
-"                                                                                  - >.c.K.K.K.K.K.G.H.K.K.G.K.z.H.K.K.K.H.H.K.K.K.K.K.K.H.r.L.                                                                                        > *.A.G.H.K.K.K.H.H.K.K.K.H.K.K.K.K.H.K.K.G.K.G.H.K.K.K.t.&.<.                                                                                      ; +.s.G.K.K.K.H.K.K.H.K.H.G.K.K.K.H.H.K.K.K.G.K.K.K.K.I.M.b.O                                                                         ",
-"                                                                                    d 2.N.O.P.Q.O.P.Q.R.N.O.O.K.O.Q.S.N.P.O.O.O.O.P.P.O.O.O.r.#.                                                                                        W a.G.S.P.O.K.O.P.P.O.O.P.O.O.P.O.P.O.K.O.P.N.S.O.O.K.O.A.[.                                                                                        : /.z.P.T.N.P.O.N.O.O.S.N.P.O.K.O.Q.O.O.P.O.P.O.O.P.P.S.G.1.^.                                                                      ",
-"                                                                                    , V t.O.O.O.O.O.Q.P.Q.P.O.P.O.P.O.Q.O.O.P.O.P.O.P.O.O.O.N.m.f.                                                                                        g y.N.O.O.O.O.O.P.O.P.O.O.O.P.P.O.O.P.P.P.O.O.P.O.P.O.N.v.V                                                                                         U.6.H.O.P.P.O.O.P.O.Q.P.Q.O.O.P.O.P.O.P.O.O.O.P.Q.O.O.N.z.].                                                                      ",
-"                                                                                      G V.H.O.P.W.P.W.P.Q.P.O.P.O.O.P.W.W.W.X.W.W.P.Q.X.W.O.W.R.b.O                                                                                         T B.O.W.X.W.X.W.X.W.Q.P.X.X.Q.X.P.X.P.Q.O.O.Q.P.X.W.W.Q.v.B                                                                                         S r.O.Q.Q.X.X.O.O.P.O.O.X.X.W.X.X.W.X.W.Q.X.Q.Q.P.P.X.Y.B...                                                                    ",
-"                                                                                        ( d.H.X.W.X.X.X.X.X.W.Q.Z.Q.W.X.X.X.X.O.W.X.P.X.X.X.W.Q.`.1.                                                                                        : /.H.X.W.X.X.X.P.Q.X.P.Q.W.X.X.W.X.X.W.W.W.Q.W.X.W.X.X.N.0.6                                                                                         A B.P.X.X.X.W.W.W.W.W.W.X.X.X.X.Q. +X.P.T.W.X.X.X.X.X.P.B.N                                                                   ",
-"                                                                                          g t.P..+Z.W.Z.W.W.W..+++@+X.Z.W.Z.W..+W.Z..+W.W.W.W.W.W.H.*.                                                                                        U.b.N.Z.Z.W.W..+X.W..+#+W.Z.Z.W.W.Z.W.W.++#+X.Z.Z.W.Z.Z.N.a.U.                                                                                      : [.K.W..+W.Z.Z.W.Z.++X.W.W.W.W.#+X.W..+.+W.W.W.W.Z.W..+O.v.f.                                                                ",
-"                                                                                            +.A..+++.+++++++Z.++++.+Z..+++.+++++$+++++W.++++++$+++Z.M.+.                                                                                        a r. +++++++++Z.++++.+Z.++.+.+++++$+++++++Z.++++++++++Z.S._.                                                                                        _ b.Q.$+++++.+Z.++++Z.++++++++++W.$+++++Z.++++++++++++.+T.q.W                                                               ",
-"                                                                                            / /.Y.%+&+*+&+*+&+&+%+&+*+$+*+=+++%+-+*+$+*+*+*+*+&+*+&+%+G.D                                                                                         #.A..+-+%+++&+&+*+%+&+&+;+=+*+*+&+*+%+*+&+.+%+&+%+++&+=+H.[.                                                                                        f.v..+&+*+=+*+>+%+&+%+++&+*+$+*+*+*+%+&+&+&+&+&+&+*+*+%+O.d.                                                              ",
-"                                                                                              ~ l.W.;+-+&+-+&+-+&+&+-+&+-+-+&+-+-+&+&+-+&+-+-+&+&+-+-+.+r.h                                                                                       : e.O.&+-+-+-+-+&+-+-+&+-+&+-+-+&+-+&+&+-+&+-+&+-+&+&+-+%+N.V                                                                                         +.`.;+-+-+&+-+-+&+&+&+-+-+&+-+&+&+-+&+-+&+-+&+-+-+&+-+&+O.e.                                                            ",
-"                                                                                                f B.#+-+,+'+&+)+)+,+!+!+,+)+&+~+)+)+)+)+)+)+&+&+,+!+&+)+++q.                                                                                        o a.;+!+,+)+)+)+)+)+)+~+-+!+{+&+,+)+)+!+{+!+]+!+-+)+)+)+^+G.B                                                                                         ].O.,+!+~+)+)+)+!+-+)+,+!+)+)+)+)+)+)+{+-+&+)+&+!+)+]+*+S.T                                                           ",
-"                                                                                                  +.K.~+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+{+#+2.                                                                                        h B.^+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+>+m.                                                                                        >.0.%+/+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+^+G.B                                                         ",
-"                                                                                                    /. +/+)+)+)+)+)+)+)+)+]+)+)+]+)+)+)+)+)+)+)+)+)+)+)+)+)+ +&.                                                                                        T K./+(+)+)+)+)+)+)+)+)+)+)+)+)+]+)+)+)+)+)+)+)+)+)+)+_+.+b.                                                                                        h t.>+)+)+)+)+)+)+]+)+)+]+)+)+)+)+]+]+)+)+)+)+)+)+)+)+)+*+v.6                                                       ",
-"                                                                                                    d w.>+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+(+(+(+(+(+(+(+(+(+)+O.T                                                                                         (.W.)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+W.x.                                                                                        A K.{+<+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+(+(+(+(+(+(+(+:+(+*+k.                                                      ",
-"                                                                                                      6 G.)+[+(+[+[+[+[+[+[+}+[+<+<+<+|+1+[+}+}+[+}+[+:+[+[+|+)+N.g                                                                                       o 0.>+(+<+<+<+<+[+[+[+[+[+<+<+[+}+[+<+[+[+[+[+<+<+<+<+<+:+2+*.                                                                                        (. +)+3+[+[+[+}+4+}+[+<+<+<+<+1+[+[+[+[+[+<+<+[+<+[+[+}+;+6.                                                    ",
-"                                                                                                        T T.(+5+5+5+5+[+[+5+5+5+3+5+5+5+3+[+5+5+5+3+3+4+[+5+5+[+)+B.                                                                                        h A.^+5+5+3+5+3+5+3+3+5+3+5+[+3+5+5+3+[+5+5+5+5+[+[+5+5+1+T.T                                                                                       o b.*+3+5+[+3+[+3+3+5+<+[+5+3+5+5+5+5+[+5+5+5+5+5+[+5+5+5+++(.                                                  ",
-"                                                                                                          (.6+5+7+8+7+8+7+8+7+7+7+8+7+8+8+8+8+8+8+7+8+8+8+8+7+7+9+,+m.                                                                                        A O.<+7+7+8+7+7+7+8+7+7+8+8+7+8+8+8+7+8+8+8+7+8+7+8+7+7+<+H.                                                                                        6 B.)+8+8+8+7+8+8+8+8+8+8+8+7+8+7+7+8+8+8+7+7+8+7+7+7+8+[+ +%.                                                ",
-"                                                                                                          o k.{+9+0+8+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+8+8+7+9+*+6.                                                                                        &.++5+a+7+7+7+7+7+7+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+0+)+b+                                                                                        C  +}+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+7+7+7+7+7+:+K.                                                ",
-"                                                                                                            f.A.[+c+a+a+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+c+c+a+a+c+c+a+>+&.                                                                                        s.d+c+c+c+c+c+c+c+a+a+c+c+a+c+c+c+c+c+c+c+c+c+c+c+c+c+e+)+b.                                                                                        (.^+f+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+a+c+c+7+c+c+c+c+c+[+z.                                              ",
-"                                                                                                              #.Q.8+c+g+c+c+h+c+c+c+c+c+c+c+c+c+g+g+c+g+c+c+g+g+c+c+g+7+.+#.                                                                                      W E.3+c+c+c+c+h+c+g+g+c+c+g+c+c+c+c+c+c+c+c+c+c+c+c+c+g+i+~+(.                                                                                        0.(+c+h+c+c+c+c+c+c+g+g+c+c+c+g+c+g+g+h+c+g+c+c+c+c+g+a+d+y.                                            ",
-"                                                                                                                (.^+e+g+j+k+g+g+g+g+g+l+g+c+g+g+c+g+g+g+g+g+l+g+g+g+g+g+m+N.                                                                                        A X.5+n+g+j+g+l+g+j+j+g+g+g+k+g+g+g+g+g+g+g+c+l+l+g+g+j+a+.+..                                                                                      W H.5+g+g+g+g+j+k+g+l+c+g+l+g+c+g+g+j+j+l+l+g+g+c+g+g+g+a+{+b.                                          ",
-"                                                                                                                  0.(+c+l+o+l+l+p+l+o+o+p+p+g+o+l+l+p+j+o+p+o+j+l+p+p+l+l+5+A.                                                                                        (.~+c+o+p+l+p+g+j+p+p+j+j+o+l+g+o+p+o+o+p+p+g+l+l+l+p+n+0+ +                                                                                        D  +8+l+n+j+l+o+l+l+l+j+l+o+j+l+l+g+l+p+g+g+p+p+g+l+o+q+c+~+].                                        ",
-"                                                                                                                  W G.[+p+p+p+p+p+l+p+o+o+p+p+p+p+p+o+o+p+p+p+p+p+p+p+o+p+j+(+k.                                                                                        0.(+h+p+p+o+j+l+o+o+p+l+p+p+o+o+o+p+p+l+l+l+p+o+p+o+o+g+3+H.                                                                                        @.*+a+l+p+l+l+p+p+o+p+o+l+p+p+l+j+o+l+p+l+l+o+p+p+l+o+p+a+Z.                                        ",
-"                                                                                                                    B  +a+p+l+p+o+o+p+p+o+l+l+o+p+p+p+l+r+s+o+o+p+p+o+p+p+p+g+t+(.                                                                                      4 A.3+j+o+l+p+o+p+o+l+o+l+l+p+p+p+o+q+o+p+l+o+p+o+p+l+p+r+<+b+                                                                                        b./+l+p+o+l+p+o+l+p+l+p+l+p+l+q+o+p+l+o+l+l+o+p+l+p+o+l+9+K.                                      ",
-"                                                                                                                      ].~+l+u+u+u+u+u+u+u+p+u+u+v+r+u+u+u+u+u+u+u+u+u+u+u+u+u+g+*++.                                                                                      D w+a+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+u+u+r+v+u+u+u+u+p+(+b.                                                                                        z.7+s+u+u+u+u+r+r+u+u+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+9+G.                                    ",
-"                                                                                                                        l.3+r+u+u+u+x+x+u+y+u+x+z+u+u+x+x+x+u+u+u+u+x+x+u+u+u+u+k+W.                                                                                        @.~+p+y+x+u+u+u+u+u+x+u+u+u+u+u+x+u+y+u+u+u+z+u+u+u+u+y+o+/+(.                                                                                      f.W.j+y+u+x+u+u+x+u+x+y+u+x+u+x+x+x+u+u+u+u+x+x+x+u+x+y+r+[+w.                                  ",
-"                                                                                                                          H.f+u+x+y+A+x+y+y+y+y+y+A+y+A+y+A+y+y+y+y+y+y+x+y+y+u+x+e+S.                                                                                        8.B+u+A+y+y+y+y+y+y+y+y+u+y+y+x+x+y+y+y+y+y+y+y+y+A+y+y+l+%+                                                                                        @.*+l+A+y+u+y+A+y+y+y+y+y+y+A+A+A+y+y+y+y+x+y+A+y+x+A+y+r+d+&.                                ",
-"                                                                                                                          f W.o+C+D+D+C+C+E+C+E+F+C+C+C+F+y+E+E+E+C+E+E+C+G+E+C+D+A+a+C.                                                                                        z.c+F+C+E+C+E+C+E+D+D+E+E+E+E+C+C+C+C+F+F+E+C+C+A+C+E+C+j+Q.                                                                                        c.}+y+E+C+E+C+C+E+C+C+E+C+C+E+D+C+C+G+D+C+C+D+D+C+C+G+E+r+*+                                ",
-"                                                                                                                            T &+x+E+A+E+D+H+D+D+D+D+H+H+H+D+D+D+D+H+C+I+D+F+A+D+D+H+A+3+0.                                                                                      f.#+q+G+D+H+E+H+H+J+A+D+H+F+E+D+H+D+D+D+D+D+D+H+D+D+D+H+E+e+t.                                                                                        z.e+y+D+D+D+H+D+D+H+D+H+H+H+A+D+D+C+F+E+H+F+F+H+H+H+D+C+p+w+                              ",
-"                                                                                                                              2.K+y+D+H+D+D+D+H+D+H+D+D+D+H+D+D+D+D+D+D+D+H+D+H+D+D+H+x+d+                                                                                        T t+r+D+D+D+D+H+D+D+H+D+D+H+D+D+D+D+D+H+D+D+H+D+D+D+D+H+F+9+k.                                                                                      h X.g+C+H+H+D+H+D+H+D+D+D+H+D+D+H+H+D+D+D+D+D+H+D+D+H+D+C+c+S.                            ",
-"                                                                                                                                z.c+E+L+M+M+M+M+L+L+L+M+M+M+L+M+M+M+L+M+M+L+M+M+M+M+M+H+s+*+                                                                                        2.[+A+M+M+M+M+M+M+M+M+M+M+L+M+M+M+L+M+M+L+L+M+M+M+M+M+L+A+}+1.                                                                                      7.!+s+L+L+L+L+M+M+M+M+L+M+M+L+M+M+M+M+M+M+L+M+M+M+L+M+M+C+0+r.                          ",
-"                                                                                                                                   +o+L+M+N+M+L+M+M+M+L+M+M+M+M+L+M+M+L+L+M+L+L+M+L+M+M+O+o+ +                                                                                        t.0+C+M+M+L+M+L+M+M+M+M+M+P+M+L+M+L+L+M+M+L+L+L+M+M+M+H+s+!+                                                                                        _.B+C+M+M+M+M+M+L+M+L+M+M+M+M+L+M+L+L+M+L+L+M+M+M+M+Q+L+C+K+_.                        ",
-"                                                                                                                                  A t+x+Q+R+S+N+T+T+S+N+S+S+M+S+S+S+M+N+S+Q+N+S+Q+S+S+N+T+O+g+G.                                                                                        O.l+M+S+Q+S+S+S+S+Q+S+N+R+S+N+T+R+M+S+S+Q+S+N+S+Q+M+N+O+r+Z.                                                                                        s.c+H+S+S+S+S+N+S+Q+Q+Q+S+S+N+Q+N+Q+S+N+N+T+R+S+S+R+M+S+A+,+                        ",
-"                                                                                                                                    2.3+U+T+R+R+T+T+R+T+R+T+T+T+T+R+T+T+T+T+R+T+T+T+R+T+R+R+H+V+q.                                                                                      D ^+y+W+R+R+R+R+R+T+R+T+R+R+R+T+R+T+T+T+T+T+T+R+T+T+T+R+S+o+X+                                                                                        O.Y+Q+R+T+T+R+T+T+T+T+R+R+R+T+R+T+T+R+R+R+R+R+T+R+T+T+R+z+>+                      ",
-"                                                                                                                                      t.c+N+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+L+3+                                                                                        (.<+O+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+`+N+n+B.                                                                                      N ~+y+ @Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+ @.@P.                    ",
-"                                                                                                                                        T.p++@`+`+`+`+`+`+`+`+`+`+`+`+`+Z+ @`+`+ @`+`+`+`+`+`+`+G+)+                                                                                        b+e+@@`+`+`+ @`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+ @`+#@9+                                                                                        e.}+L+`+`+`+`+`+`+`+`+`+`+`+`+$@Z+`+`+`+`+`+`+`+`+`+`+`+@@g+B.                  ",
-"                                                                                                                                          ^+A+$@`+`+`+`+`+`+`+`+`+%@`+%@`+`+`+`+`+`+`+`+%@%@`+%@&@x+w+                                                                                        N.v+@@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@`+`+`+`+`+`+Z+E+)+                                                                                        0.c+#@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@%@`+`+`+`+M+0+w.                ",
-"                                                                                                                                          (.[+N+*@*@*@=@*@*@-@*@*@-@*@;@-@*@*@*@;@*@;@-@;@;@*@=@=@%@r+X+                                                                                        *+J+>@*@;@*@*@*@*@*@=@*@*@*@*@*@-@*@-@;@=@,@*@*@*@*@*@>@J+^+                                                                                        S.Y+&@*@-@,@=@,@*@=@-@=@-@;@,@*@-@;@-@-@*@;@-@*@*@-@-@%@N+3+                ",
-"                                                                                                                                            0.k+W+;@'@,@;@'@,@-@,@;@'@;@,@,@;@'@;@;@,@,@;@;@'@,@,@,@&@g+r.                                                                                      *.[+N+*@;@,@;@;@-@;@,@;@;@-@,@,@,@'@;@;@,@,@'@;@'@-@'@)@!@u+ +                                                                                        >+F+~@-@,@,@,@;@=@,@-@{@,@,@;@,@-@)@,@;@;@;@-@'@,@;@;@;@D+{+              ",
-"                                                                                                                                              K.r+*@)@)@)@)@,@'@)@)@)@)@)@)@'@)@)@)@)@)@)@)@)@)@)@)@]@ @7+                                                                                        q.h+&@)@)@,@{@)@)@)@)@)@)@'@)@,@)@,@)@)@)@)@)@)@,@)@)@,@^@q+A.                                                                                       .<+N+,@/@)@)@)@)@)@)@'@)@)@)@)@)@)@)@'@)@)@'@)@)@)@'@)@-@(@w.            ",
-"                                                                                                                                                ;+C+;@_@)@/@/@)@)@'@/@,@'@/@:@/@'@)@/@/@'@'@/@/@)@/@/@=@S+1+                                                                                        G.r+^@/@:@)@)@)@/@/@'@/@:@)@/@/@)@)@)@/@)@,@)@:@/@:@)@:@%@e+                                                                                        b.a+&@:@/@/@'@)@<@:@)@:@/@/@:@,@)@/@:@)@)@/@:@/@/@/@)@)@~@A+3           ",
-"                                                                                                                                                ..1+S+;@)@_@/@)@_@/@_@)@_@_@_@_@/@_@_@_@_@)@_@:@_@_@/@,@[@H+&+                                                                                        .+C+]@_@_@_@,@_@_@/@<@:@)@_@_@)@:@_@_@)@/@_@_@_@_@_@_@_@Z+[+                                                                                        z.n+}@|@:@)@_@_@:@/@_@_@_@_@/@:@/@_@_@)@_@)@/@_@:@)@_@1@%@8+          ",
-"                                                                                                                                                  6.e+S+:@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@:@/@_@{@A+2@                                                                                        3@N+]@_@_@_@_@_@_@_@:@/@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@]@#@'+                                                                                        W.C+{@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@/@)@_@_@_@_@_@_@4@$@w+        ",
-"                                                                                                                                                    B.v+)@5@_@6@5@_@7@_@_@_@_@_@_@_@6@8@8@6@_@_@7@6@_@6@5@_@,@p+t.                                                                                      1.7+9@4@_@5@_@5@8@6@_@7@7@_@6@7@8@6@_@_@_@_@_@_@_@5@_@5@:@D+W.                                                                                        ]+N+_@8@5@8@6@_@_@_@_@_@_@6@8@5@_@5@_@8@7@6@_@5@0@8@5@:@@@Q.      ",
-"                                                                                                                                                      %+D+<@7@5@5@7@5@5@5@7@5@5@7@5@7@7@6@6@7@5@_@5@5@5@5@5@8@=@c+                                                                                        t.r+,@6@5@5@0@8@5@7@7@5@5@7@5@7@5@5@5@5@5@7@5@5@5@7@5@6@)@u+E.                                                                                      a@f+>@5@5@5@7@5@5@7@5@7@6@6@7@5@_@7@5@7@5@5@5@5@5@7@5@7@b@M+(.    ",
-"                                                                        z                                                                               )+c@6@d@e@7@7@7@f@d@7@d@7@e@7@f@5@f@f@5@f@7@5@7@d@d@f@7@%@5+                                                                                        T.E+8@d@f@5@e@f@7@7@7@d@5@e@e@7@7@d@e@7@5@f@7@7@f@5@d@e@;@q+                                                                                        B.q+{@7@e@7@f@7@7@5@e@f@e@7@7@f@7@f@5@f@7@5@f@7@7@e@f@7@{@a+g@  ",
-"                                                                        G &.                                                                            (.f+>@d@h@h@h@h@e@i@h@7@i@h@h@7@d@h@7@d@h@h@7@h@i@7@h@h@6@ @{+                                                                                        )+&@d@d@d@i@j@d@h@h@7@d@i@i@h@h@e@h@h@0@d@h@h@7@d@h@h@e@~@a+                                                                                        Q.D+|@h@h@j@h@i@d@d@i@i@d@7@h@h@7@d@i@d@7@i@h@h@h@j@h@d@:@k@  ",
-"                                                                        f %+&+                                                                            s.p+:@h@i@h@h@d@h@h@e@h@h@h@e@h@h@e@h@i@i@d@h@h@e@h@h@l@7@D+Q.                                                                                      [.8+*@6@h@h@h@h@h@h@e@h@h@h@h@i@d@h@h@e@e@h@h@d@i@h@h@h@m@$@d+                                                                                        &+@@7@i@h@h@i@h@l@h@i@d@i@h@h@d@h@h@d@i@h@h@h@i@h@h@i@h@,@;+",
-"                                                                         .c+E+!+                                                                            W.D+7@n@i@n@o@p@h@o@o@n@n@n@o@n@n@o@n@n@o@n@n@n@h@o@n@i@:@A+K.                                                                                      r.q@:@p@n@n@n@n@n@n@o@o@o@i@o@n@o@h@p@n@o@n@o@n@n@o@n@n@7@@@&+                                                                                        8+>@e@o@n@h@h@n@o@n@o@n@n@n@o@n@o@o@n@o@o@o@i@o@n@h@h@o@&@",
-"                                                                        2.u+[@D+T.                                                                            {+$@l@o@n@n@n@n@n@n@o@n@o@n@n@o@n@n@n@n@o@n@o@o@n@n@n@o@)@l+                                                                                        S.E+f@n@o@n@o@o@n@n@n@n@o@n@o@n@n@n@o@n@o@o@n@n@o@n@o@n@6@E+S.                                                                                      0.q+4@n@n@n@n@n@o@o@n@o@o@n@o@o@n@o@n@n@n@o@n@n@n@o@n@n@7@",
-"                                                                      P r.E+r@8@r+                                                                              9+-@s@o@n@n@o@n@n@n@o@n@n@o@n@n@o@n@o@n@n@n@n@t@n@o@n@p@;@m+                                                                                        ~+T+i@u@n@o@n@v@n@n@n@n@o@n@o@o@n@n@n@n@n@n@o@o@n@o@n@n@_@Y+                                                                                        H.E+7@n@o@n@n@o@o@v@n@o@n@n@n@o@o@o@n@n@n@n@n@o@n@n@n@p@",
-"                                                                      ! I.M+p@v@)@w@                                                                            a.l+_@n@x@o@n@n@o@n@y@v@n@x@x@n@n@u@v@o@o@n@x@v@n@v@v@n@l@^@d+                                                                                        [+-@n@x@o@n@z@v@v@v@x@x@n@n@o@n@n@n@x@n@v@v@z@n@o@n@z@o@,@a+                                                                                        %+R+d@n@n@o@n@z@z@n@n@x@x@o@n@x@n@x@v@n@x@n@v@n@v@n@n@",
-"                                                                      { Z.&@o@n@p@-@[+                                                                            H.(@7@x@v@x@x@n@x@x@z@v@x@x@x@v@x@x@n@v@v@n@n@x@n@x@x@u@i@@@#+                                                                                      8.k+4@u@n@x@x@n@v@x@v@n@x@v@n@x@v@x@x@x@z@x@y@x@n@v@z@n@o@*@1+                                                                                        (+>@o@x@v@n@x@x@x@x@x@z@n@x@z@n@n@z@x@v@x@z@v@x@v@n@",
-"                                                                      ~ ]+)@A@B@C@x@Z+~+                                                                            Z.@@n@C@C@C@C@D@B@E@B@z@x@D@D@z@D@B@B@D@B@z@C@C@C@C@C@D@l@E+                                                                                        A.z+f@C@C@F@B@B@C@D@x@D@C@C@C@A@C@x@B@z@B@n@B@D@C@F@G@C@v@Z+*+                                                                                      _.g+8@B@C@B@z@v@x@D@v@B@C@C@B@B@B@C@B@x@z@D@D@C@C@D@",
-"                                                                      6 9+7@H@I@A@A@i@S+Z.                                                                            (+)@D@I@A@B@A@A@I@I@I@C@I@A@I@B@C@A@I@A@A@A@A@I@I@B@A@I@d@u+                                                                                        $+S+n@I@A@A@I@A@I@C@A@I@A@I@C@C@I@I@I@I@C@A@A@I@C@B@I@J@o@L+Q.                                                                                      u.y+i@B@B@I@C@A@I@D@C@C@I@A@I@A@A@I@C@I@I@I@I@C@D@",
-"                                                                      D g+l@H@A@I@B@A@l@y+                                                                              e+:@A@I@x@I@I@A@A@A@I@I@A@A@I@A@I@A@A@A@B@G@I@A@x@A@I@C@8@e+                                                                                        (+-@z@A@I@A@I@A@I@A@B@I@A@B@D@I@I@A@I@A@A@A@A@A@I@I@A@K@h@.@                                                                                         +N+i@z@I@I@I@A@I@A@I@I@I@A@A@A@I@I@I@B@A@A@D@B@",
-"                                                                      [.p+i@L@I@I@I@A@D@0@l+                                                                            u.y+d@I@I@I@A@I@I@A@I@A@I@A@A@A@I@I@A@A@I@A@I@A@I@A@I@J@E@*@1+                                                                                        e+/@z@A@A@I@I@I@A@A@A@I@A@A@A@I@I@A@A@I@A@I@I@A@A@I@A@z@8@n+                                                                                        )+*@z@L@A@I@I@I@I@A@I@I@I@I@A@I@A@I@A@A@I@A@A@",
-"                                                                      b.F+x@M@I@H@H@H@L@B@<@m+                                                                            X.R+x@L@H@H@H@L@H@H@H@H@L@L@H@H@L@H@I@H@H@L@L@L@H@H@H@L@B@Z+w+                                                                                      m.y+l@I@N@H@L@A@H@H@L@H@H@H@H@H@H@H@L@H@H@H@L@H@H@H@L@I@C@/@3+                                                                                        e+8@A@H@L@H@H@H@H@H@L@L@H@H@L@J@H@L@H@L@H@L@",
-"                                                                      t.M+B@H@H@H@L@H@H@J@z@>@{+                                                                            {+*@v@H@H@L@H@H@H@I@L@H@I@L@L@H@L@H@H@H@I@H@A@L@H@I@H@L@n@H+                                                                                        O.H+n@H@H@H@H@L@H@L@I@I@H@H@L@H@L@H@I@L@H@I@I@H@H@H@H@H@z@`+^+                                                                                      b.q+d@L@H@H@H@H@I@H@I@I@H@H@H@H@H@J@L@I@L@I@",
-"                                                                    ! X+^@L@N@O@N@M@N@H@N@H@v@ @#+                                                                            7+|@C@M@P@M@L@N@H@M@N@H@N@M@H@M@M@N@H@H@N@M@H@H@M@M@L@M@Q@R@                                                                                        ~+*@C@M@N@M@N@I@L@S@M@M@L@N@M@H@N@M@M@N@N@M@N@H@S@H@N@H@v@@@                                                                                        G.E+n@M@L@H@S@M@T@T@H@T@N@O@N@N@L@L@H@N@H@",
-"                                                                    { *+U@P@V@M@H@H@V@L@N@M@N@v@A+                                                                            0.p+f@M@V@M@H@T@N@M@V@V@M@N@N@T@H@M@N@N@T@M@H@T@M@L@H@T@O@W@j+                                                                                        K+:@A@T@M@M@H@P@V@P@H@M@V@N@L@M@T@M@T@T@T@M@T@V@H@M@M@N@t@F+                                                                                        *+~@K@H@N@T@M@P@V@T@M@M@M@N@H@H@N@T@T@H@",
-"                                                                    4 )+|@X@T@V@T@T@V@T@T@T@T@M@d@p+                                                                            G.L+v@T@T@T@V@V@T@V@M@N@V@T@T@T@T@V@V@T@T@V@T@T@T@T@T@V@Y@Z@B+                                                                                        l+d@M@T@T@T@T@V@T@T@V@V@T@T@V@T@T@V@T@H@V@V@T@V@T@T@T@M@d@l+                                                                                        K+4@L@V@M@M@T@T@L@N@T@T@T@T@T@T@V@T@T@",
-"                                                                    | `@d@V@V@T@T@T@V@T@T@T@T@T@O@|@`@                                                                            .+9@K@V@T@V@T@T@T@T@V@T@T@T@V@V@T@T@T@V@T@T@T@V@T@T@T@T@E@^@%+                                                                                      z.D+o@T@T@V@T@T@T@T@V@V@T@T@V@V@V@V@T@T@V@T@T@T@V@V@T@T@A@]@ #                                                                                        n+e@O@V@V@T@T@T@T@T@T@V@V@T@T@V@T@V@",
-"                                                                    A j+x@.#+#+#+#X@T@V@V@T@V@T@T@Y@:@,+                                                                            3+_@L@@#T@T@.#.#+#@#.#T@.#+#+#T@V@T@T@T@V@+#+#+#T@##.#.#z@S+                                                                                        k@%@K@T@V@T@T@T@V@.#T@@#+#X@V@.#.###+#.#+#+#T@##T@V@T@T@D@%@-+                                                                                      A.I+x@P@##.#+#V@##+#+#+#T@T@T@T@T@T@",
-"                                                                    &.y+B@.#.#.#.#.#.#.#.#####.#.#+#L@Z+                                                                              q+d@X@.#.#+#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#+#+#.#.#+#$###v@A+                                                                                        :+)@M@.#.#.#.#.#.#.#@#+#.#.#+#.#.###.###.#.#.#.#.#.#.#.#G@R+                                                                                        #+Z+L@%#.#####.###.#.#.#####.#.#.#",
-"                                                                    b.H+A@.#.###.#.#.#.#.###.#.#.#.#.#B@U+                                                                            r.F+x@##.#.###.#.#.#.#.#####.#.#.###.#.#.###.#.#.#.#.#.#N@7@g+                                                                                        &#e@T@.###.#.#.#.#.#####.#.#.#.#.###.#.#.#.###.###.#.#+#x@E+                                                                                        )+{@P@.#.#.###.#.#.#.#.#.###.#.#",
-"                                                                    v.c@M@$#.#%#.#.#$#.#X@.#$#@#.#%#$###v@s+                                                                            T.&@A@.#$#%#.#$#$#.#$#.#.#$#$#+###$#$#.#$#$#.#.#$#$#.#$#T@_@3+                                                                                        x+x@%###+#$#$#.#.#%#.###$#$###.#$#.#$#.#.#.#$#+#+#$#$#+#s@r+                                                                                        7+e@##.###$#.#*#%###.#$#.#+#$#",
-"                                                                  1 T.;@+#$#$#$#$#$#$#$#.#$#$#*#$#.#$#$###f@a+                                                                            {+-@M@.#.#$#$#$#$#$#$#$#$#$#.#$#$#$#$#.#$#.#$#$#$#$#$#$#H@;@~+                                                                                      S.@@Y@*#.#$#$#$#$#.#.#%#$#.#%#$#$#$#$#$#$#$#$#.#.#$#$#$#V@6@7+                                                                                        u+n@+#$#$#$#$#$#$#$#$#$#.#$#",
-"                                                                  : *+6@.#$#$#$#$#$#.#.#$#$###%#$#$#$#$#$#T@{@]+                                                                            7+f@X@$#$#$#$#$#$#$#$#.#.#$#$#.#.#$#$#$#$#$#$#$#$#$#$#$#I@&@                                                                                        *+~@M@$#.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%###$#$#.#.#$#$#N@,@~+                                                                                      H.#@A@$#$#$#$#$#$#$#.#.#$#%#",
-"                                                                  j.(+d@$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#Y@&@                                                                              r+o@.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$###v@x+                                                                                        3+8@+#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#L@@@                                                                                        &+*@M@$#$#$#$#$#$#$#$#$#$#",
-"                                                                  6 8+p@$#$#$#=#$#$#=#=#$#$#$#$#$#$#$#$#$#$#$#D@-#                                                                            A.D+G@%#$#$#$#=#=#$#$#=###$#$#;#$#$#=#$#$#$#$#$#$#$#$#=#X@f@>#                                                                                        o+p@%#=#$#$#$#$#$#$#$#=#$#$#$#=#=#$#$#=#$#$#$#=#$#$#;#$#x@C+                                                                                        }+_@X@$#$#=#$#$#$#$#.#$#",
-"                                                                  D p+z@=#=#=#,#,#=#'#)#=#=#=#=#=#=#,#=#=#=#!#%#v@u+                                                                            W.;@+#=#=#=#,#,#=#,#,#=#=#'#'#=#=#,#=#=#=#,#=#=#=#=#'#!#+#|@K+                                                                                      D.H+C@,#=#=#'#=#=#=#=#!#=#=#=#,#)#=#=#)#,#=#=#,#=#=#'#!#.#s@Y+                                                                                        j+x@.#=#,#,#=#=#=#=#=#",
-"                                                                  &.A+T@~#)#{#,#)#{#,#)#]#]#{#)#)#~#]#)#)#~#,#)#;#n@k+                                                                            3+7@=#)#)#=#)#{#]#)#{#~#~#{#)#)#)#)#)#{#)#{#~#~#{#'#~#]#+#{@                                                                                        ++*@##,#)#!#)#)#)#)#,#)#~#)#)#)#)#]#)#,#)#)#{#~#)#,#)#]#^#Q@8+                                                                                        L+I@=#,#]#~#)#{#)#]#",
-"                                                                  k.@@$#/#(#_#]#]#(#]#)#/#/#(#(#]#(#]#)#/#/#{#(#(#:#7@1+                                                                            q+D@~#_#)#(#(#/#/#(#(#/#]#]#/#]#]#]#(#<#]#[#/#(#/#]#_#]#N@>@                                                                                        [+|@.#~#]#]#/#_#_#)#/#/#(#]#)#/#/#(#(#_#_#~#(#]#]#]#~#(#.#8@(+                                                                                      W.}#@#)#/#/#]#(#(#/#",
-"                                                                  G.,@'#/#_#/#_#_#_#_#/#_#_#_#_#_#_#_#/#_#_#_#_#_#_#%#;@                                                                              |#N@~#/#_#/#/#_#_#_#_#/#_#/#_#_#_#/#/#_#/#/#/#_#_#/#_#)#N@O+                                                                                        g+x@!#_#_#/#_#_#_#/#_#/#_#/#_#_#_#/#_#_#_#_#_#_#_#/#_#/#.#;@                                                                                        ]+5@'#/#/#_#_#_#_#",
-"                                                                  W.6@~#1#2#_#_#3#4#/#_#3#1#3#_#_#2#_#_#3#3#/#/#_#2#(#5#R+                                                                             +;@##(#1#3#_#_#2#_#2#_#_#3#1#_#_#_#/#/#_#2#/#_#1#3#_#/#/#D@.@                                                                                        J+O@/#_#/#_#_#_#_#3#3#_#_#2#/#_#3#1#2#/#_#1#3#/#_#_#_#_#N@ @                                                                                        c+n@]#4#_#_#3#1#",
-"                                                                { )+x@6#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#6#1#O@C+                                                                            (+0@{#2#6#2#2#2#2#2#2#2#7#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#/#t@7+                                                                                      T.!@;#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#1#M@F+                                                                                        D+T@1#2#2#2#2#",
-"                                                                <.[+G@8#9#9#9#8#9#0#9#9#8#8#9#9#8#9#0#9#9#9#9#8#9#9#9#a#b#A@p+                                                                            n+A@/#c#0#8#8#8#9#9#9#8#9#9#8#9#9#d#9#9#9#9#8#9#9#0#9#9#(#r@                                                                                        (+l@/#8#9#9#8#8#9#9#9#e#9#9#9#8#8#9#9#9#9#9#9#8#9#9#9#f#3#K@n+                                                                                      P.*@'#8#8#9#9#",
-"                                                                  %+l@_#g#h#i#i#h#j#c#j#i#9#j#h#0#k#j#i#h#i#j#0#h#h#i#i#j#1#E@7+                                                                            L+.#9#j#0#c#8#h#j#i#c#j#j#9#k#i#9#h#k#j#j#j#h#h#j#h#9#c#~#_@                                                                                        j+Y@2#h#h#9#0#k#j#h#j#h#j#h#h#9#h#j#h#l#k#j#9#h#j#9#i#k#1#t@                                                                                        ]+e@1#9#i#9#",
-"                                                                    y+T@m#k#j#j#k#j#k#g#g#h#k#k#k#k#g#j#k#h#g#k#k#k#j#j#k#h#1#e@                                                                              -@)#j#k#k#j#k#j#k#k#k#g#k#k#i#k#k#h#i#i#g#k#h#g#k#j#k#i#,#`+                                                                                        E+@#l#k#h#k#k#g#k#j#h#g#k#k#h#k#g#k#k#h#i#h#k#g#h#j#n#j#]#8@                                                                                        o#Y@2#k#h#",
-"                                                                      %@!#k#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#q#(#)@                                                                            /+l@2#p#p#p#p#p#p#q#n#p#p#p#p#p#p#r#p#p#p#p#p#p#p#p#p#p#c#%#D+                                                                                        -@!#k#p#p#p#p#p#p#r#p#p#r#p#p#p#p#q#q#p#p#p#p#p#p#n#p#q#]#;@                                                                                        h+%#c#p#",
-"                                                                      %+8@_#n#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#,#R+                                                                            e+I@a#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#p#p#p#r#a#N@l+                                                                                      {+d@3#q#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#n#q#p#p#p#h#;#S+                                                                                        W+!#s#",
-"                                                                        a+K@0#t#t#t#u#t#u#t#v#u#t#u#w#v#v#w#t#t#t#t#t#t#t#t#u#w#r#*#C+                                                                            M+=#x#t#t#w#v#v#w#u#t#u#t#t#t#t#t#t#t#t#v#w#u#t#w#u#w#w#a#A@                                                                                        c+K@i#t#t#t#u#t#t#w#v#v#w#t#t#u#w#v#v#w#u#t#t#t#t#t#t#t#s#.#x+                                                                                      T.y#e#",
-"                                                                          F+;#z#A#B#B#B#B#v#C#B#B#u#B#B#u#u#B#B#B#B#B#B#B#B#B#B#B#q#X@                                                                              ,@2#w#D#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#B#B#B#B#v#B#B#u#u#9#l@                                                                                        E+$#E#B#B#B#B#B#B#B#B#B#v#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#n#H@                                                                                        Q.##",
-"                                                                            *@7#F#G#G#H#G#G#H#I#G#A#J#K#H#J#G#I#G#G#I#I#H#K#G#I#K#I#k#E@                                                                            {+o@j#H#I#K#F#J#G#G#F#K#I#H#K#J#G#H#G#G#I#J#K#I#I#G#F#G#L#e#:@                                                                                        U@M#L#G#J#H#J#G#H#I#G#G#H#K#J#F#G#G#A#G#H#I#J#K#G#I#G#H#h#y@                                                                                        N#",
-"                                                                              l@h#O#P#Q#R#S#S#R#R#S#S#R#S#S#S#K#S#R#Q#G#S#R#R#O#R#R#G#j#l@                                                                            e+T@E#G#P#R#R#R#O#S#R#Q#O#S#S#Q#S#S#R#O#S#S#S#T#R#S#R#U#A#1#Z+                                                                                        l@q#O#S#Q#S#S#S#T#R#S#Q#R#O#S#R#O#S#S#Q#O#S#R#Q#O#S#R#J#i#5@                                                                                        ",
-"                                                                              8+J@z#V#W#W#U#X#Y#W#W#X#U#W#Z#W#R#Z#X#Y#`#W#W#X#W#W#W#Y#G#6#,@                                                                            E+{#L#R#X#X#U#S#Z#X#W#X#X#W#W#U#W#X#Y#W#W#Y#`#W#W#X#W#S#J#)#A+                                                                                      7+T@t#Y#W#W#W#W#W#W#U#Z#W#R#Z#Y#S#Z#X#W#W#Z#Y#Y#W#W#X#Y#I#6#*@                                                                                      ",
-"                                                                                x+=#L#Y#Z#X#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $I#/#c@                                                                            >@e#O# $Z#X#Z#Z#Z#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $.$@#                                                                                        F+)#H# $Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#+$I#@$-#                                                                                    ",
-"                                                                                  %@6#R##$$$%$%$&$%$%$&$#$$$#$%$&$%$%$%$%$%$%$%$#$$$%$%$#$G#{#                                                                              p@v#*$&$&$&$&$%$%$&$%$%$%$%$%$%$%$%$&$%$%$$$#$%$&$&$#$*$w#=$                                                                                        -@9#Y#*$%$%$%$$$#$%$&$$$#$&$&$&$%$%$#$$$%$%$%$%$%$%$%$#$G#$#                                                                                    ",
-"                                                                                    d@x#*$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$$J#@#                                                                            a+@#G##$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$-$;$i@                                                                                        o@x#*$>$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$#$A#M@                                                                                  ",
-"                                                                                      T@F#,$,$'$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$>$,$,$&$L#D@                                                                            E+/#X#>$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$,$>$,$,$,$,$,$,$,$*$h#{@                                                                                      8+@#O#,$)$,$'$,$,$>$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$'$!$$$v#B@                                                                                ",
-"                                                                                      s+]#~${$]$^$]$^$^$]$^$^$^$)$]$)$)$)$]$)$)$]$)$)$]$^$]$/$>$w#f@                                                                            ;@($>$]$]$^$]$)$^$]$)$)$]$)$)$]$^$/$/$]$]$]$]$]$^$]$]$)$~$9#S+                                                                                      z+_#X#_$^$]$]$]$]$]$^$]$]$]$]$^$)$)$]$)$)$^$/$)$]$]$]$)$>$w#:$                                                                              ",
-"                                                                                        ^@g#>$<$[$<$[$<$[$[$}$[$^$[$<$<$]$<$<$^$|$<$]$1$[$}$}$}$'$p#;@                                                                            v@F#)$<$[$[$}$[$}$}$}$<$<$]$|$1$}$<$|$<$|$}$|$<$[$|$]$]$*$]#                                                                                        >@j#&$]$[$<$<$[$|$<$}$[$<$|$<$2$}$<$<$<$<$<$}$<$[$<$]$|$,$q#%@                                                                            ",
-"                                                                                          l@B#]$|$3$|$4$3$5$3$3$5$5$|$4$3$|$3$5$3$3$3$3$3$|$|$|$3$!$e#                                                                              ##Y#<$3$5$6$5$|$3$3$|$4$3$3$3$6$|$3$6$|$|$3$|$3$3$3$5$<$7$^#                                                                                        l@J#8$5$6$|$5$3$|$[$3$3$3$|$5$9$6$4$3$|$5$3$|$5$|$3$0$|$$$2#                                                                            ",
-"                                                                                            N@X#5$a$a$a$a$a$b$b$a$a$a$b$a$3$b$a$a$a$a$a$a$a$a$a$a$0$>$/#                                                                            y+2#>$c$a$a$a$a$a$a$9$a$a$a$a$a$a$b$a$a$a$b$b$a$d$a$a$d$5$Y#H@                                                                                        .#X#3$d$a$b$a$a$a$a$a$a$a$a$b$b$a$a$b$3$b$a$a$b$b$a$a$9$&$@$                                                                          ",
-"                                                                                            v+4#>$a$a$d$a$a$a$d$a$a$a$e$b$a$a$b$a$f$b$a$a$d$a$e$d$a$5$~$%#                                                                            g$p#]$a$e$b$a$a$d$a$e$a$a$9$a$a$e$d$a$a$a$a$a$a$e$a$a$e$h$F#7@                                                                                      .@4#>$9$b$e$a$d$a$a$a$a$a$a$a$a$a$a$a$a$a$a$9$a$b$e$d$a$c$ $T@                                                                        ",
-"                                                                                              Z+x#}$d$i$j$j$k$l$l$j$l$i$j$k$l$j$l$l$j$l$l$m$j$i$j$m$n$a$S#A@                                                                            p@T#e$i$l$m$l$o$j$i$j$l$l$o$k$i$j$m$l$l$j$j$l$i$l$m$i$l$5$w#                                                                                        !@u#|$d$i$l$m$m$l$j$k$j$i$i$k$l$l$j$l$j$k$l$l$m$i$o$n$o$b$O#x@                                                                      ",
-"                                                                                                d@S#d$p$p$q$p$i$p$p$r$r$p$s$p$p$p$p$p$p$p$q$q$p$p$q$p$l$b$O#7@                                                                            $#t$j$q$p$p$p$s$p$s$p$p$p$p$i$q$s$u$p$r$r$p$p$q$p$p$p$p$|$j#                                                                                        i@W#d$v$p$s$s$p$p$s$p$i$r$p$p$p$s$p$r$p$p$p$p$p$p$s$s$l$e$w$/@                                                                    ",
-"                                                                                                  +#%$j$x$y$p$p$x$s$p$s$z$s$z$s$r$s$s$x$p$u$q$s$x$z$s$p$s$b$z#                                                                              1#}$s$p$q$s$s$s$s$x$p$x$r$p$s$x$x$q$y$s$p$x$z$q$q$s$A$p${$B$                                                                                        @#$$k$r$z$s$p$x$s$q$p$u$s$q$q$x$q$x$s$p$x$p$r$p$z$s$q$u$4$q#                                                                    ",
-"                                                                                                    (#}$z$C$C$C$D$C$C$C$D$E$F$C$C$C$C$F$C$F$C$C$F$F$C$C$F$C$0$c#                                                                            ^@u#m$z$C$C$C$C$E$D$C$F$C$C$C$E$E$C$G$E$C$G$D$E$C$C$C$C$s$_$$#                                                                                        2#[$z$C$E$E$D$E$E$C$H$C$E$C$C$C$C$G$C$C$C$C$C$C$E$C$C$x$4$i#                                                                  ",
-"                                                                                                    S+t#j$F$I$I$I$I$J$I$J$I$I$I$J$I$J$J$J$I$J$I$I$J$I$I$J$I$F$c$/#                                                                            o@Z#q$K$L$I$J$J$J$J$J$I$J$I$J$I$J$I$J$J$J$J$J$I$J$I$I$K$x$$$Y@                                                                                       @w#k$L$J$J$J$I$I$I$J$I$I$F$I$I$I$I$J$J$J$I$I$I$J$I$I$I$F$5$B$                                                                ",
-"                                                                                                      6@W#x$J$J$M$M$N$I$O$O$O$O$O$O$O$M$O$O$O$M$M$O$O$J$O$O$O$H$P$.#                                                                            $#)$Q$O$O$M$M$O$O$O$O$M$O$O$M$M$O$O$J$O$M$O$I$O$O$O$O$I$x$W#                                                                                        i@X#A$O$J$O$M$O$I$O$M$O$O$M$O$O$O$O$O$O$O$O$O$O$O$O$M$O$E${$T@                                                              ",
-"                                                                                                        +#)$D$O$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$O$R$R$R$M$z$$$z@                                                                            e#0$J$R$R$R$R$O$R$R$R$R$R$R$R$R$R$M$S$R$R$R$R$R$R$R$R$S$q$F#                                                                                        .#}$K$R$R$R$R$M$R$R$R$R$R$R$R$R$O$R$R$R$R$R$R$R$R$R$R$M$z$~$                                                              ",
-"                                                                                                          T$U$R$V$W$V$V$W$X$V$W$V$W$V$W$V$R$V$V$Y$W$V$Z$W$V$V$Z$W$Q$P#                                                                             @L#u$Y$V$W$V$W$Y$V$W$X$V$V$V$W$V$Y$W$V$W$V$V$W$V$V$V$W$M$i$n#                                                                                        8#j$X$Y$V$V$Y$V$Y$V$V$V$Y$W$W$V$R$W$V$Y$X$V$V$W$W$V$W$Y$A$K#                                                            ",
-"                                                                                                            w#`$Y$ % %Z$Z$Z$ %V$ %.% % % %Z$ % %V$+% %V$+% % %V$ %V$x$u#                                                                            d@@%#% %Z$ %V$ % %V$Z$V$ %$%V$ %V$Z$.%V$ % %.% % % % %%%Y$d$&%                                                                                        u#`$X$ % %V$V$ % % % %.%V$ % % %V$ %Z$Z$ % %Z$V$ %V$$%W$q$*%                                                          ",
-"                                                                                                            |@U#K$=%-%=%$%;%>%-%>%>%>%>%>%>%-%;%;%-%>%.%;%-%$%=%-%>% %v$k#                                                                            V@3$+%,%;%;%-%>%;%>% %>%,%;%;%$%$%-%;%$%-%;%>%$%;%>%-%>%+%5$+#                                                                                      f@%$J$=%=%=%$%;%$%$%$%>%;%>%>%;%;%;%>%-%;%-%>%-%-%$%;%'%Z$k$a#                                                        ",
-"                                                                                                              I@5$W$>%)%!%!%~%!%{%!%]%{%!%!%^%{%^%^%!%!%~%^%!%^%^%!%^%Z$m$/#                                                                            /%q$ %(%!%{%^%!%!%^%!%(%]%^%!%^%^%!%^%!%!%^%!%!%!%{%!%;%R$)$                                                                                        +#9$Z$>%_%]%^%^%(%(%^%^%!%!%(%~%!%!%^%{%!%:%^%!%!%^%{%^% %d$<%                                                      ",
-"                                                                                                                _#k$-%:%:%:%[%:%[%~%[%[%[%:%[%:%[%~%:%~%~%:%:%~%:%:%[%~%}%a$                                                                              J#K${%[%:%[%[%:%[%~%[%~%~%:%~%:%~%[%:%[%[%[%:%[%~%[%:%!%R$~$                                                                                        |%k$-%~%~%[%[%[%1%[%[%:%[%~%[%:%1%[%~%[%:%~%~%:%~%:%[%^% %5$                                                      ",
-"                                                                                                                  x#F$^%[%[%[%[%[%2%[%[%2%[%[%2%1%[%2%[%2%[%1%[%[%[%[%[%[%Z$,$                                                                            5@$$W$:%1%[%2%[%[%2%2%[%[%1%2%[%[%[%[%[%[%[%[%2%[%[%2%[%!%I$F#                                                                                        u#F${%1%[%[%[%[%[%[%[%2%[%[%[%2%[%2%2%1%[%[%2%3%[%[%[%~%Y$>$                                                    ",
-"                                                                                                                    *$4%5%6%6%6%6%6%2%6%6%6%6%6%2%6%6%2%6%6%2%6%6%6%6%6%6%7%R$U#                                                                            V@8%9%5%2%6%6%6%6%2%6%6%2%6%6%6%6%6%6%6%6%6%6%6%2%6%6%5%0%u$k#                                                                                        a%V$5%6%6%6%6%6%6%6%6%6%2%6%6%6%6%2%6%6%6%2%6%6%6%6%6%7%b%T#                                                  ",
-"                                                                                                                    A@c%d%5%e%f%6%g%h%6%g%g%i%f%i%g%6%6%f%i%6%g%f%6%g%g%6%j%k%l%m%                                                                            _#n%o%6%p%g%e%6%g%g%f%6%i%g%6%e%f%6%j%f%6%g%g%g%6%i%q%6%r%s%)#                                                                                      O@t%u%6%i%g%f%6%v%g%f%i%q%6%f%h%f%f%g%g%6%6%i%6%e%g%6%6%w%x%y%                                                ",
-"                                                                                                                      z%A%B%v%C%C%e%D%C%C%e%v%E%F%e%e%G%e%e%e%v%F%e%v%C%F%q%i%H%I%J%                                                                            K%L%M%g%v%F%F%C%g%f%v%e%v%v%C%v%g%v%v%F%C%i%C%C%f%F%q%N%O%c%                                                                                        P%s%o%i%C%F%e%F%C%v%e%F%C%F%v%Q%F%f%e%e%e%R%g%C%C%e%e%v%S%T%U%                                              ",
-"                                                                                                                        V%W%X%Y%Z%`%`%Z%`%Z%`% &Z%`%Z%`%`%Z%`%Z%`%Z%`%`%`%`%C%Y%.&+&                                                                              @&#&$&%&Z%Z%`%Z%`%Z%Z%%&`%C%Y%Z%Y%`%`%Y%&&*&`%Y%`%Z%Z%v%=&-&                                                                                        K%;&>&Y%,&Z%Z%Z%C%`%C%Z%`%`%Z%Z%Y%`%Z%Z%Y%Y%Y%`%Z%Z%Z%Y%B%'&                                              ",
-"                                                                                                                          )&!&~&{&]&{&^&]&]&^&^&]&^&^&]&/&]&^&]&/&]&^&^&^&/&]&^&(&_&:&                                                                            <&[&}&|&^&^&^&]&^&/&/&]&^&]&^&]&^&^&^&/&]&^&/&]&^&^&^&]&1&2&3&                                                                                        4&5&6&(&/&^&^&]&]&]&^&^&/&^&^&]&^&^&]&]&^&/&^&]&]&^&^&(&_&7&                                            ",
-"                                                                                                                          8&9&_&0&]&/&]&]&]&a&a&/&a&a&]&]&]&a&a&]&]&a&a&]&]&/&]&]&(&b&c&                                                                            d&e&f&]&a&]&]&a&/&/&]&]&a&a&/&a&a&/&/&]&]&]&]&a&a&]&/&a&g&h&i&                                                                                      j&k&l&m&]&a&]&]&]&]&]&]&a&a&]&]&a&a&]&]&]&a&a&]&]&a&]&]&n&o&p&                                          ",
-"                                                                                                                            q&r&f&]&a&a&a&s&a&a&t&a&a&a&a&a&a&a&a&a&]&a&a&a&a&a&a&a&(&u&v&                                                                            i&w&n&]&a&a&a&a&]&a&a&a&a&a&]&a&a&a&a&a&a&t&a&a&a&t&a&x&y&z&                                                                                        A&B&f&]&/&a&a&a&a&a&a&t&a&C&a&a&a&a&/&a&a&C&a&a&D&a&a&]&n&E&F&                                        ",
-"                                                                                                                              G&H&I&t&J&K&t&t&K&K&t&t&J&L&M&K&J&s&L&J&t&M&L&L&t&t&t&N&O&P&Q&                                                                            R&S&O&J&K&K&K&K&J&L&M&t&s&K&N&L&L&t&T&K&t&t&t&K&N&K&K&U&V&W&                                                                                        X&Y&Z&N&K&J&M&t&L&L&t&t&K&t&J&N&K&K&K&L&K&t&N&K&L&J&t&t&Z&`& *                                      ",
-"                                                                                                                                .*+*@*#*K&#*K&#*J&$*%*J&#*$*#*J&#*$*#*%*$*$*$*J&K&#*J&$*&***                                                                              =*-*J&#*#*#*#*#*$*;*%*J&#*#*#*$*>*J&#*$*J&$*J&#*#*J&J&,*'*)*                                                                                        !*~*{*J&#*#*%*J&J&#*$*K&J&#*J&J&#*#*$*L&#*J&J&J&J&#*$*]*^*/*                                      ",
-"                                                                                                                                  (*_*:*$*<*[*[*}*[*$*$*}*<*$*$*<*$*}*$*$*$*[*}*#*<*#*[*:*|*1*                                                                            2*/*3*:*[*$*#*<*$*$*[*:*[*[*}*#*<*[*$*}*:*[*$*<*[*:*}*4*%*5*6*                                                                                        7*8*:*$*<*$*}*$*<*[*[*}*[*#*:*<*$*$*[*<*$*[*}*#*}*$*9*%*|*0*                                    ",
-"                                                                                                                                  a*b*c*:*d*<*e*f*<*<*<*f*d*e*<*f*e*g*<*<*<*d*f*<*f*<*<*f*:*h*i*                                                                            j*k*l*e*<*<*d*<*<*d*g*<*<*d*<*f*d*<*<*g*<*<*d*<*g*f*d*<*:*+*m*                                                                                      n*o*c*p*d*<*d*<*<*<*<*f*<*<*g*f*<*<*g*f*e*<*f*<*g*<*<*<*q*_*r*                                  ",
-"                                                                                                                                    s*t*u*f*v*v*w*x*x*x*w*x*v*w*w*v*x*f*y*y*x*v*w*y*v*v*y*w*z*A*B*                                                                            C*D*E*x*w*x*v*x*f*x*x*y*x*w*w*x*y*y*v*F*w*w*x*v*w*x*v*w*G*t*                                                                                        H*I*J*f*x*x*w*w*x*w*w*F*v*v*w*x*v*d*w*v*w*K*w*w*x*x*w*L*M*D*N*                                ",
-"                                                      ).                                                                              O*P*z*v*Q*R*v*F*w*x*S*v*x*Q*S*S*v*T*Q*v*x*v*Q*x*T*U*V*W*X*Y*Z*                                                                            `* =g*x*U*x*x*.=Q*S*v*Q*x*S*F*F*S*v*S*v*Q*x*y*x*U*v*F*W*G*+=                                                                                        @=#=$=F*Q*v*S*U*x*Q*S*v*w*Q*.=x*x*U*S*v*Q*v*S*x*v*v*U*%=&=*===                              ",
-"                                                      [.-=                                                                              ;=>=,=S*'=S*Q*S*'=)=U*S*)=S*)=U*'=)=S*'=U*!=S*)='=S*S*v*~={=                                                                              ]=^=/='=Q*S*U*S*'=S*'=S*)=Q*Q*)=U*)=S*'=Q*S*'=!=S*Q*)=v*(=_=                                                                                        :=<=[='=}=)='=S*!=S*Q*Q*)=Q*S*S*!=S*!=!=Q*!=U*!=S*Q*'=|=1=2=                              ",
-"                                                      '+3=                                                                                4=5=}=!=6=7=6=6=6=7=7=6='=7=!=6='=8=7='='=7=7=9='=6=6=0=a=b=                                                                            c=d=e=6=f=7=!=!=6=!=7='=g=6=h=!='=!=6='=6=6=h=7=7=7=6=!=i=j=k=                                                                                        l=m=!=6='=6=7='=7=h=!=7=7=7='=6=!=n=6=o=n=6=6='=!=6=p=.=q=r=                            ",
-"                                                      C+s=l=                                                                              t=u=v=w=x=y=6=7=x=z=7=x=x=A=p=z=B=w=A=x=z=C=D=x=x=A=x=7=E=F=G=                                                                            H=I=J=w=x=6=x=A=7=A=z=K=w=w=x=p=A=x=7=x=x=6=x=w=L=7=x=M=N=O=P=                                                                                      Q=R=S=z=T=B=x=6=C=x=6=x=z=x=6=w=w=T=x=z=K=x=A=z=x=x=A=w=/=U=V=                          ",
-"                                                      ]@W=X=Y=                                                                              Z=`= -M=.-A=A=+-A=A=+-@-.-M=+-#-$-.-.-+-$-$-@-+-.-A=+-M=%-&-*-                                                                            =---E=A=A=.-.-A=.-.-+-$-.-.-M=.-+-;-+-y=A=+-+-A=M=.-.-w=>-,-                                                                                        '-)-!-M=+-+-+-~-y=M=+-+-A=A=+-@-+-+-.-+-+-@-.-+-+-{-.-]-^-&-/-                        ",
-"                                                      s@(-_-:-<-                                                                              [-}-|-.-.-1-1-.-1-1-.-1-.-.-.-.-.-@-.-1-.-.-1-.-.-1-1-.-2-3-                                                                              4-5-6-.-7-1-.-@-.-.-.-.-.-7-.-1-.-1-.-1-1-.-.-8-9-1-.-+-0-a-                                                                                        b-c-d-.-1-1-1-.-@-1-.-1-.-7-.-7-.-@-.-.-.-.-1-.-7-.-1-@-2-e-                        ",
-"                                                    f-g-h-6-i-j-k-                                                                              l-m-n-1-1-8-o-8-8-p-p-p-p-p-p-p-p-q-p-p-8-1-1-p-1-8-o-@-r-s-                                                                            t-u-v-$-8-p-p-p-p-p-p-p-1-p-q-o-.-1-1-1-1-p-1-1-o-p-p-w-q-x-y-                                                                                        z-A-9-o-1-1-1-1-1-p-p-q-1-p-p-p-p-p-p-p-o-o-8-p-.-1-1-@-r-B-                      ",
-"                                                    6.C-D-E-F-G-H-                                                                                I-J-K-F-F-F-F-F-F-F-F-F-L-F-F-M-F-F-M-F-F-M-F-F-F-F-F-N-O-P-                                                                            Q-R-S-w-F-F-F-M-F-F-M-F-F-M-M-F-M-F-F-F-F-F-F-F-F-F-F-M-N-T-U-                                                                                        V-W-w-F-F-F-F-F-F-F-F-F-F-F-F-M-F-F-F-M-F-M-M-F-F-M-F-K-X-Y-                    ",
-"                                                    Y.Z-`- ; ;.;+;@;                                                                              #;$;%;&;*;M-=; ; ; ;=;=; ;-;=; ;=; ;M- ; ; ;M- ; ;M- ; ;E-;;>;                                                                            ,;';); ; ; ; ; ;M- ; ;=; ;M- ; ;M- ;!; ;L- ; ; ; ;=; ;~;{;];C-                                                                                      ^;/;(;&;_; ;M-!;=;-; ; ; ; ; ; ; ;M-M- ; ; ;M- ; ; ;M-!;:;<;[;                  ",
-"                                                    B+};|;1;1;2;_;3;4;                                                                              5;6;7;!; ;1;!;!;!;!;=;!;8;=;!;1;!; ;!;1;!;!;1;!; ;!;1;_;9;0;a;                                                                            };b;c;1; ;!;d;1; ;1;1;!;!;!;1;!;1;8; ;!;1;!;1;!; ;!;8; ;e;f;                                                                                        g;h;i;j;k;1;8;1;1;!;!;1;d; ;!;1;l;M-!;!;1;1;1;1;!;!;l;_;i;m;n;                ",
-"                                                    q@o;p;8;q;r;s;t;u;v;                                                                              w;x;y;z;A;z;s;8;r;r;8;8;s;r;l;s;r;l;r;s;B;l;8;r;8;A;r;C;D;E;                                                                              F;G;_;s;B;8;l;s;l;r;s;s;8;H;B;A;8;r;s;l;s;l;s;s;B;8;I;J;K;L;                                                                                        M;N;O;P;P;8;s;l;z;r;s;8;s;B;8;l;s;8;s;r;r;8;A;s;s;l;s;l;Q;R;                ",
-"                                                    N+S;T;U;V;W;W;W;X;Y;Z;                                                                              `; >.>+>@>W;W;+>+>W;r;U;+>W;W;#>+>V;W;W;+>W;W;W;+>W;W;W;$>%>                                                                            &>*>=>->W;W;q;U;W;W;#>#>W;W;W;@>W;W;+>@>W;W;W;U;W;W;q;W;J;;>>>                                                                                        ,>'>)>!>W;W;+>U;+>W;U;W;W;W;s;W;W;W;V;V;W;+>W;W;+>W;W;->~>*>              ",
-"                                                    |@{>]>^>/>/>(>^>_>:><>                                                                                [>}>|>1>/>_>/>(>^>2>#>^>1>/>/>2>(>/>/>^>/>/>3>^>/>/>/>4>5>6>                                                                            7>8>9>/>1>_>V;1>/>_>/>1>_>/>^>^>_>^>^>(>(>/>/>^>^>_>(>^>0>a>b>                                                                                      c>d>e>|>^>/>^>/>/>2>/>_>3>^>1>#>^>f>/>(>^>/>/>(>^>/>1>^>4>g>h>            ",
-"                                                    i>j>k>1>1>^>^>1>^>l>m>n>                                                                              o>p>q>r>^>^>^>^>1>1>1>1>^>1>^>^>1>1>^>1>^>^>1>1>^>1>^>3>s>t>u>                                                                            v>w>x>1>^>1>^>1>1>^>^>^>1>^>1>^>^>1>^>^>1>^>1>^>^>^>^>(>y>z>A>                                                                                      B>C>:>r>^>1>^>^>(>^>2>^>^>2>1>^>1>^>^>1>^>1>^>1>^>^>1>^>D>E>*$          ",
-"                                                    F>G>H>I>J>J>I>J>K>J>/>L>M>                                                                              N>O>P>^>3>^>K>^>I>I>1>I>K>I>J>J>I>K>^>I>J>^>K>K>^>3>I>3>Q>G>R>                                                                            S>T>U>J>^>J>J>J>J>I>J>I>1>K>J>1>V>J>2>1>K>I>^>J>^>J>K>^>W>X>                                                                                        R>Y>D>J>^>^>I>^>(>I>^>^>K>I>^>I>J>K>J>K>I>^>Z>J>^>^>J>3>`> ,.,        ",
-"                                                  O.+,@,#,$,%,%,&,*,=,-,;,>,,,',                                                                              ),!,>,%,%,*,*,*,$,~,*,%,$,$,%,;,*,*,&,%,%,$,*,*,%,%,-,J>{,],                                                                              ^,/,(,-,*,;,%,;,*,%,~,-,$,=,;,%,%,;,%,-,*,$,*,~,~,%,*,J>_,:,                                                                                        <,,,[,-,%,~,*,%,*,~,*,%,~,%,*,%,%,*,%,%,},-,I>*,%,$,~,|,{,1,        ",
-"                                                  2,3,4,5,6,5,7,5,8,5,5,6,9,0,a,b,                                                                              c,d,#,5,e,8,e,6,7,e,5,e,e,5,5,8,e,8,9,5,6,e,8,5,e,8,e,f,g,h,                                                                            i,j,k,l,8,7,7,7,e,5,7,m,e,5,e,5,e,7,7,e,e,6,8,9,6,7,8,5,n,4,o,                                                                                        p,q,r,5,e,e,7,8,5,e,8,s,l,e,5,5,e,7,5,5,8,5,8,7,6,6,7,f,t,u,      ",
-"                                                  v,w,x,y,z,y,z,z,A,z,9,z,z,B,C,D,                                                                              E,F,G,H,I,z,J,z,7,z,y,K,L,z,z,A,z,z,B,L,z,y,z,A,L,z,y,I,f,M,N,                                                                            O,P,Q,y,y,z,z,z,z,y,L,z,z,J,z,J,z,z,z,y,z,z,9,y,y,A,y,L,R,S,T,                                                                                      U,V,G,B,A,y,z,z,9,z,y,L,y,y,z,z,z,z,L,y,z,z,J,z,z,y,z,I,W,X,Y,    ",
-"                                                  -#Z,`,A, 'z, ' ' ' '.' ' '+'z,@'#'                                                                              $'%'&'*' 'z, 'z, 'A,='+' ' ' ' ' 'z, ' 'A, ' '+' 'A, 'z,-';'>'                                                                            ,''')'z, ' ' ' ' ' ' ' 'z, 'z, ' ' 'A, ' 'z,A,A, 'A, '.'!'~'                                                                                        {']'^'A,A, ' '*' 'A, 'A,A, ' ' ' ' ' ' ' 'z, ' 'A, ' 'z,/'('_'  ",
-"                                                  [@:'<'['}'|'|'}'}'|'1'}'}'|'2'3'4'5'                                                                              6'7'8'|'|'}'|'}'|'}'}'}'}'}'}'|'1'}'|'|'}'9'}'}'|'|'|'|'8'0'a'                                                                            b'c'd'}'}'|'}'|'}'|'}'1'|'}'|'9'}'|'|'|'|'}'}'|'}'}'}'e'f'g'                                                                                        h'i'j'|'}'}'}'}'}'|'|'|'}'}'}'|'|'}'|'}'1'}'|'}'9'}'|'2'k'l'  ",
-"                                                  m'n'8'1'1'1'1'}'1'}'|'1'1'1'1'1'o'p'q'                                                                              r's't'|'1'|'1'1'1'1'1'1'}'1'1'|'1'1'1'1'1'1'u'v'w'}'1'x'y'z'                                                                              A'B'9'1'1'w'}'1'w'}'}'u'u'1'1'u'1'1'C'}'1'1'1'1'1'1'}'D'E'F'                                                                                        G'H'I'w'1'}'1'|'1'}'w'1'1'1'1'1'['u'}'|'1'1'1'1'1'1'1'e'J'K'",
-"                                                  L'M'N'O'P'1'P'Q'O'P'1'R'O'u'Q'S'T'U'V'W'                                                                              X'Y'Z'Q'P'Q'`'O'Q'R'O'P'Q'Q'u'P'Q'u'P'Q'P'1'P'P'P'Q'Q'x' ).)                                                                            +)@)k'P'Q'O'`'P'Q'Q'P'O'`'P'Q'Q'1'P'#)u'Q'1'Q'P'Q'R'P'$)%)H'&)                                                                                        *)B'x'$)u'P'Q'O'P'=)u'Q'P'P'P'`'-)Q'u'O'Q'u'P'Q'w'P'P';)>)",
-"                                                  ,)')))!)~)~){)])^)/)(){)_)_)])/)~){):)<)                                                                              [)})|){)1)~)/)1)2)~)_){)/)/)1){)3)/)/)~){)4){)3)1)~){)1)5)6)7)                                                                            8)9)N'{)_)1){)/)0){)1)~)/)a)/)$){)1)/)~){)!){)$)1)/)/)1)b)c)d)                                                                                      e)f):){)]){)3)1){){)1)g)~)1)3)1)1)0)1)1)/)]){){)a)1)/)!)h)",
-"                                                  i)j)k)l)m)0)n)_)o)p)q)1)r)p)g)m)m)n){)s)t)                                                                              u)v)w)^)q)p)r)^)x)r)q)!)p)m)1)m)l)p)1)m)q)n)l)q)q)p)p)_)5)y)z)                                                                            A)y)B)p)m)1)p)l)1)/)^)p)/)^)q)p)r)m)^)p)p)m)^)r)m)m)p)n)C)D)                                                                                        E)F)G)m)l)l)H)1)l)p)p)q)p)m)1)H)l)/){)!)o)^)^)q)p)p)p)/)",
-"                                                I)J)K)n)L)M)p)M)p)M)N)!)O)N)N)p)M)M)N)M)P)Q)R)                                                                              S)T)U)M)M)M)N)V)N)p)M)M)o)O)M)M)N)O)M)M)N)M)N)M)N)N)M)p)W)X)Y)                                                                            Z)`)P)p)p)N)M)p)V)M)M)p)N)N)N)M)M)M)M)M)M)M) !O)N)N)M)^).!+!                                                                                        @!#!$!p)M)M)M)M)M)M)M)M)O)m)N)M)p)p)M)M)p)N)M)N)N)M)M)",
-"                                                %!&!*!=!-!;!;!=!=!=!=!=!=!=!=!=!=!M)=!=!=!k)>!,!                                                                              '!)!!!=!=!=!=!=!;!=!=!=!=!=!=!=!=!L)M)=!=!=!N)=!=!=!=!N)~!{!                                                                              ]!^!/!=!=!;!=!=!N);!=!=!=!M);!;!M)=!=!=!=!=!=!=!=!=!=!(!_!:!                                                                                        <!Q)P)N)=!=!M)=!=!=!=!=!=!=!=!=!=!=!N);!=!;!M)=!=!;!",
-"                                                [!}!|!-!-!=!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!1!2!                                                                                3!4!N)-!=!-!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!5!6!7!                                                                            8!9!0!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!=!-!-!-!a!b!)!c!                                                                                        d!6! !-!-!=!-!-!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!",
-"                                                e!f!g!h!i!j!j!k!j!j!l!-!j!l!l!j!j!m!l!-!l!k!-!n!o!                                                                              p!q!r!s!i!j!m!t!j!j!-!j!t!j!j!j!i!i!-!j!i!j!t!i!j!t!i!j!u!v!w!                                                                            x!y!z!t!j!-!j!l!k!-!j!i!a!A!k!j!j!i!i!i!B!j!j!j!l!-!j!l!C!D!E!                                                                                      F!G!H!k!i!j!i!m!j!j!l!-!j!j!-!t!j!I!l!J!k!l!-!m!K!",
-"                                                L!M!N!O!m!P!Q!P!s!R!R!R!Q!Q!R!Q!m!R!R!m!P!R!R!B!S!T!                                                                              U!V!W!P!R!Q!s!R!X!m!Q!Q!P!R!P!Q!R!Y!P!Q!R!s!P!R!P!P!s!Q!Z!`! ~                                                                            .~+~I!m!i!R!@~#~Y!$~P!Q!k!R!Q!Q!P!s!R!R!Y!R!%~R!#~P!Q!s!&~*~                                                                                        =~-~C!Y!Q!R!m!P!Q!P!m!O!Q!P!Q!Q!P!R!R!R!R!i!k!R!",
-"                                                ;~>~,~'~'~)~!~~~'~'~O!'~)~)~)~{~%~{~'~'~Q!'~]~%~^~/~(~                                                                              _~:~<~{~%~{~)~)~R!~~)~'~[~'~)~{~{~O!'~}~O!)~'~'~O!{~~~'~|~1~                                                                              T!2~P!'~3~)~[~!~R!{~~~)~)~~~4~R!{~)~{~{~}~{~)~'~O!'~)~5~6~7~                                                                                        8~9~^~}~)~'~O!)~O!R!!~)~!~{~)~'~{~%~)~)~!~#~4~",
-"                                                0~1~a~b~c~d~c~e~f~e~e~g~e~e~c~c~f~c~e~e~c~e~[~b~e~h~i~j~                                                                              k~l~m~g~c~e~e~e~e~e~c~c~f~c~n~g~c~c~o~e~b~e~p~e~c~d~e~o~q~r~                                                                            s~t~u~{~p~n~c~f~c~c~e~b~c~v~f~e~f~d~c~c~d~w~d~e~e~b~f~x~y~z~A~                                                                                        B~C~D~n~c~e~e~e~e~e~d~e~c~e~c~c~f~f~o~e~c~f~",
-"                                                E~F~G~H~I~I~J~I~I~J~I~I~I~I~I~I~I~I~c~c~I~I~f~I~I~K~L~M~                                                                                N~O~P~I~I~I~J~I~J~J~I~J~I~c~f~I~I~Q~c~I~I~I~I~J~I~J~I~K~R~S~                                                                            T~U~,~J~J~I~I~I~I~c~Q~I~I~I~I~I~J~I~I~I~I~J~I~I~I~I~I~I~D~V~W~                                                                                        t~X~K~I~I~I~I~I~J~I~I~I~J~I~I~I~I~Q~f~J~J~",
-"                                              Y~Z~`~J~ { { { { { { {I~ { { { { { { { { {I~ { {I~ { {.{+{@{                                                                              #{${%{J~ { {I~ { { { { { { { {c~ { { {I~ { { { { { {H~ {d~&{*{                                                                            ={-{m~ { { {J~ { {J~H~ { {I~ { { { { { {I~ { { { { { { {;{>{                                                                                        ,{'{){.{ { { { {!{~{ { { { { {I~ { { {c~ {",
-"                                                {{]{^{/{!{/{/{!{/{!{/{/{!{!{!{!{!{/{!{!{/{/{!{!{!{!{/{({_{:{                                                                              <{[{}{/{/{!{!{/{/{/{!{!{/{/{/{!{!{!{!{!{!{!{!{!{/{/{!{|{1{2{3{                                                                            4{5{^{/{!{!{/{!{/{!{/{!{/{!{/{/{!{!{/{!{/{!{!{!{!{/{!{|{6{7{                                                                                        8{9{0{|{!{!{!{!{!{/{/{!{!{/{!{!{/{/{!{!{",
-"                                                a{b{c{d{e{f{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{({g{h{                                                                              i{j{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{l{m{                                                                              n{o{|{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{d{d{d{d{p{q{r{                                                                                        s{t{({u{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{",
-"                                                  v{w{x{y{y{y{y{y{y{z{y{y{y{y{A{y{y{A{y{y{B{z{y{y{y{y{y{C{D{E{F{                                                                              G{H{I{y{y{y{y{y{J{y{J{A{y{K{y{y{y{y{y{y{y{y{y{z{y{y{y{z{L{M{                                                                            N{O{P{Q{y{y{y{z{C{y{y{y{y{y{y{y{y{y{z{y{y{y{y{A{y{y{y{z{R{S{T{                                                                                        U{V{R{J{J{y{y{A{y{y{y{A{y{y{J{z{y{C{",
-"                                                    W{X{Y{Z{K{K{`{ ]Z{K{`{K{`{.]`{+]Z{`{Z{@].]K{Z{#]K{ ] ]@]$]%]                                                                              &]*]=]C{`{K{-];]`{-]-]K{`{K{@]K{-]`{K{`{K{@]`{K{#]K{`{Z{C{>],]                                                                            '])]x{@]-]`{;]K{.]K{#]@]K{ ]C{`{`{.]+]K{;]-]K{@].]`{`{K{!]~]{]                                                                                      ]]^]/]C{-]`{+]Z{`{K{-]@]K{-]`{-].]K{",
-"                                                      (]_]:]<]<][]<]<]+]<]<]}]|][]-]-]<]-]@]<]<]+]<]<]<][]<]Z{1]2]                                                                              3]4]5]6]<]Z{+]<]7]+]<][]K{<]<]-]}]<][]<]<][]-]<]<][]Z{8]C{9]0]                                                                            a]b]c]@][]<]@]+]<]<]<]<][]<]<]<]<]+]<]+]-]<]<]|][]<]@]|]d]e]                                                                                        f]g]h]-][][]Z{[]<]-]}]<]@]<]<]+]K{",
-"                                                      i]j]k]l]m]m]m]m]m]n]m]n]m]n]n]n]n]n]n]m]m]m]m]m]n]m]m]m]l]o]p]                                                                              q]r]s]n]n]m]m]m]m]n]m][]m]m]n]n]n]n]m]m]m]n]m]m]m]n]n]t]u]r]v]                                                                            w]x]y]m]m]n]m]n]n]m]m]m]m]n]m]m]z]m]m]n]n]m]m]m]m]n]m]n]A]B]                                                                                        C]D]E]n]n][]n]m]n]n]n]F]n]m]m]n]",
-"                                                        G]H]I]J]K]K]K]L]K]K]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]M]N]O]P]                                                                              Q]R]N]S]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]K]n]K]J]T]U]                                                                              V]W]X]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]n]K]K]K]K]K]K]K]n]W]Y]                                                                                        Z]`] ^K]L]K]K]K]m]K]K]K]K]K]K]",
-"                                                          .^+^@^K]L]K]m]L]L]L]L]L]L]L]L]L]K]K]L]K]L]L]L]L]L]L]n]M]#^$^%^                                                                              &^*^=^L]L]L]L]K]L]m]L]L]K]L]L]L]K]L]L]m]-^L]L]L]L]L];^K]>^j]                                                                            ,^'^)^!^-^-^L]L]L]L]L]K]L]L]K]K]L]L]L]L]L]L]L]L]K]~^L]L]{^]^^^                                                                                        /^(^S]K]L]L]L]L]L]L]L]K]K]K]",
-"                                                            _^:^<^[^[^}^[^|^1^|^1^L]|^1^1^}^|^|^L]1^2^|^1^1^|^}^[^1^y]3^                                                                              4^5^6^L]1^2^1^1^|^L]1^L][^1^2^|^1^[^|^7^[^|^1^|^1^L]1^1^M]8^9^                                                                            0^a^b^c^1^2^|^2^1^c^1^[^|^[^}^[^1^|^1^1^;^|^1^1^7^2^|^c^b^d^e^                                                                                      f^g^h^i^j^[^2^|^[^L]1^1^1^c^",
-"                                                              k^l^m^n^o^o^p^p^q^r^r^o^q^p^r^o^o^o^s^o^o^r^o^p^o^o^p^t^u^v^                                                                              w^x^y^[^r^p^r^o^o^r^o^o^[^o^o^o^o^p^o^o^p^p^p^q^r^p^r^p^i^z^A^                                                                            B^C^D^t^o^o^r^s^E^o^o^p^p^o^o^p^p^r^q^r^o^F^o^q^o^o^r^t^y^G^                                                                                        H^I^J^t^o^o^r^o^o^t^p^p^o^",
-"                                                              K^L^M^p^F^o^p^p^p^p^n^N^o^N^p^p^p^o^O^p^P^o^p^p^o^o^p^p^F^Q^R^                                                                              S^T^U^p^N^o^N^o^p^p^N^O^p^N^p^o^p^t^o^p^p^p^p^p^V^o^O^t^W^X^Y^                                                                            Z^`^F^p^p^o^O^ /p^o^p^p^o^o^./p^o^p^O^N^./o^p^p^p^o^ /n^+/L^                                                                                        @/#/$/p^./%/o^o^ /p^N^o^",
-"                                                                H^&/*/n^O^n^n^ /././=/ /=/ / /=/n^-/ /;/>/ /n^n^O^n^O^n^,/'/)/                                                                              !/~/{/-/ /=/ / / /;/=/./=/ /=/O^N^O^O^ /O^./ /=/./=/./ /]/^/                                                                              //(/p^-/ /-/_/./O^O^n^n^n^ /=/ / /_/=/=/./././=/ /:/</[/}/|/                                                                                        1/2/3/>/</./ /./>/=/ /",
-"                                                                  4/5/6/7/8/9/8/8/-/-/9/0/a/>/0/7/9/7/9/7/7/7/8/7/8/b/c/9/d/e/f/                                                                              g/h/_/8/0/-/./i/0/b/7/9/7/0/7/9/8/7/9/8/9/8/9/-/0/-/_/-/j/k/                                                                            l/m/n/>/7/9/8/7/7/7/8/9/0/-/7/9/8/-/-/7/7/ /b/0/7/o/c/9/p/q/r/                                                                                        s/h/t/7/8/9/-/9/7/-/",
-"                                                                    u/v/t/w/x/y/0/0/y/y/y/z/y/y/y/0/0/x/A/7/y/0/0/y/x/z/0/9/B/C/                                                                              D/E/F/z/x/0/z/x/y/G/7/y/x/0/y/z/0/y/y/y/0/0/H/y/y/0/H/I/J/K/L/                                                                            M/N/O/0/-/y/y/0/y/x/0/0/0/y/z/0/0/y/x/z/0/x/y/z/9/y/x/z/P/Q/R/                                                                                      S/E/n/T/0/0/y/y/H/0/",
-"                                                                      U/V/W/x/x/x/X/x/x/Y/X/x/X/Z/x/`/ (x/x/`/w/`/x/x/x/x/X/.(V/+(                                                                              @(#($(%(Z/x/`/X/X/`/X/y/x/x/w/x/`/x/y/x/X/`/x/x/X/x/&(Z/*(5/=(                                                                            -(;(>(`/X/x/x/x/y/w/`/x/`/`/`/X/x/X/Z/`/`/X/X/`/X/x/x/,('()(                                                                                        !(~(P/.(Z/x/x/Z/X/",
-"                                                                      {(](^(Z//(((((_(((:(((_(((:(((_(:(<([(((Z/_(_(((<(((((}(I/|(1(                                                                              2(3(4(((((_(Z/((_(((X/_(_(Z/((_(((Z/((((_(((:(((((((:(((5(6(                                                                              7(8(%(_(X/_(9(((Z/[(((_(((((((((:(:(((_(((Z/[(_(X/_(0(%(a(b(                                                                                        c(d(e(((((((X/((",
-"                                                                        f(g(h(i(j([(k([(_([(l(m(_(_(n(_(9(n([(_(n(o([(i([(n(p(o(q(r(s(                                                                              t(u(v(l(n(_(w(w(_([(n([(_([([([(p([([(x(n(_([([(y((([(w(z(A(                                                                            D/B(z(_(9([(i(_(_(k([(k(n([([([(_(_(_(k(_([(k([([(n(w([(C(D(E(                                                                                        F(G((([(l(<([(",
-"                                                                          H(I(J(K(L(L(L(M(N(n(p(O(p(M(P(L(Q(L(i(N(i(i(L(L(L(L(L(N(R(S(                                                                                T(U(n(L(O(K(V(N(O(W(i(i(W(p(L(L(L(L(L(L(L(V(p(w(X(K(L(Y(Z(`(                                                                             _._+_@_P(k(i(i(L(i(L(L(L(L(L(L(V(L(L(L(V(K(M(O(N(p(p(M(#_$_%_                                                                                        &_*_n(k(M(X(",
-"                                                                            =_-_Y(;_;_>_,_,_P('_)_;_;_,_>_,_;_O(!_,_;_;_;_;_;_,_,_>_~_{_                                                                              ]_^_/_P((_;_,_,_O(;_,_O(__,_;_;_,_;_,_O('_;_'_@_,_;_,_,_k(:_<_                                                                            [_}_|_(_,_;_>_,_,_;_;_,_,_;_>_,_;_O(,_>_;_)_1_,_,_;_2_,_3_4_5_                                                                                      6_7_8_L(,_;_",
-"                                                                              9_0_a_b_!_1_)_c_1_,_b_)_,_!_c_1_,_b_d_(_!_,_)_b_,_1_e_(_f_g_                                                                              h_4_i_a_b_e_,_,_c_d_>_!_b_1_!_)_,_!_b_1_,_c_d_1_!_)_)_)_j_k_l_                                                                            m_n_o_p_1_e_b_e_!_)_1_e_c_1_1_p_b_>_)_p_,_)_b_e_1_e_c_q_r_s_                                                                                        t_u_v_N(!_",
-"                                                                              w_x_y_z_z_A_!_B_b_c_c_C_p_b_b_b_b_b_b_D_B_c_b_E_F_C_!_z_G_H_I_                                                                              J_K_L_M_B_b_b_b_b_p_b_p_b_E_C_c_b_F_B_b_c_A_N_c_B_b_p_p_O_P_                                                                              T(Q_R_S_b_b_b_N_C_C_c_F_B_C_c_C_b_E_B_B_p_b_b_b_b_b_p_p_T_U_                                                                                        V_W_X_E_",
-"                                                                                Y_Z_`_c_ :.:b_+:@:S_@:#:.:@:$:%:&:@:F_z_+:S_F_E_*:+:!_=:-:;:>:                                                                              ,:':):!:~:.:$:%:.:E_.:+:+:z_F_#:c_@:@:c_E_ :S_@:.:.:%:#:{:{_                                                                            ]:^:/:(:_:_:+:+:#:F_z_c_F_@:=:+:@:.:$:::.:S_@:+:~:z_+:#:<:[:,:                                                                                        }:|:1:",
-"                                                                                  2:3:4:5:6:7:8:9:0:a:b:c:d:e:8:c:f:0:g:0:h:d:e:i:6:7:j:k:l:m:                                                                                n:o:e:p:q:r:s:t:u:j:0:6:v:w:x:r:9:9:e:r:5:v:y:z:q:r:b:A:B:C:                                                                            D:E:F:G:g:v:d:f:b:v:H:v:5:I:7:g:d:J:p:K:r:r:7:8:u:v:x:u:L:M:N:                                                                                      O:P:Q:",
-"                                                                                    R:S:T:U:U:V:W:V:8:X:5:V:W:W:Y:5:5:V:V:Z:`:V:V:V:U:U:V: <.<+<                                                                              @<#<$<X:Z:W:%<U:U:V:V:&<V:5:5:U:W:V:U:V:V:U:8:5:G:V:W:V:*<=<-<                                                                            ;<><,<V:U:&<X:V:5:'<V:V:U:5:U:i:Z:Z:i:V:Z:V:V:V:V:W:W:)<!<~<                                                                                        {<]<",
-"                                                                                    ^</<(<_<:<Y:W:<<<<:<'<'<[<Y:V:'<U:W:Y:Z:U:'<W:9:'<'<W:<<}<|<1<                                                                              2<3<4<5<'<:<:<V:U:'<U:Y:W:W:'<Y:_<Y:Y:W:'<<<:<'<Y:[<'<G:6<7<8<                                                                            9<0<*<'<U:U:U:Z:Y:'<_<V::<'<U:a<<<'<'<'<[<V:V:'<U:U:U:b<c<d<                                                                                        e<",
-"                                                                                      f<g<h<i<j<j<k<k<l<m<m<k<n<j<n<k<j<k<n<n<o<n<n<m<j<n<k<k<p<q<r<                                                                              s<t<u<v<n<m<j<j<k<n<m<m<j<k<j<m<n<m<j<m<o<j<j<m<m<n<j<j<w<x<                                                                              y<z<A<m<n<k<j<m<m<n<o<o<j<n<k<o<n<k<n<k<j<j<k<m<n<k<j<B<C<D<                                                                                        ",
-"                                                                                        E<F<G<H<I<J<K<L<M<H<N<N<I<N<H<M<l<N<H<I<H<L<M<H<K<N<H<L<O<P<Q<                                                                              R<S<T<N<U<M<J<N<J<l<L<U<I<J<I<K<H<M<J<K<N<I<H<N<H<K<N<V<W<X<                                                                            Y<Z<`<H<j< [.[L<M<M<l<N<N<K<L<M<H<N<H<H<N<K<H<H< [I<.[+[@[#[$[                                                                                      ",
-"                                                                                          %[&[*[l<H<N<L<L<.[M< [M<J<l< [H<J<N<I<l<K<M< [j<N<I<L<L<=[-[                                                                              ;[>[,[L<n<l<.[ [I<L<M<L<L<I<l<N<l<l<J<.[N<K<.[L<l<I<H< ['[)[![                                                                            ~[{[][K<N< [N<I<k<L<K<J<K<.[H<M<K<N<l<n<N<K< [K<N<I<N<^[/[([_[                                                                                    ",
-"                                                                                            :[<[[[}[M<U<}[U<}[L<|[U<J<U<1[K<2[}[H<+[U<}[ [U<M<U<}[H<3[4[                                                                              5[6[7[N<U<8[J<U<}[J<H<2[2[ [}[.[N<H<L<.[U<}[U<J<}[9[J<U<0[a[b[                                                                            c[d[e[U< [}[}[I<.[J<f[J<N<J<U<9[U<U<N<|[N<.[U<U<M<2[9[g[h[i[                                                                                    ",
-"                                                                                            j[k[l[9[m[n[9[|[m[o[p[o[q[n[2[m[r[8[o[p[r[s[r[8[r[t[9[u[v[w[x[                                                                              y[z[A[n[B[C[t[}[u[C[8[r[n[p[D[r[8[n[r[9[8[o[C[p[r[C[o[1[E[F[G[                                                                            H[I[J[r[r[r[o[8[n[B[8[9[r[B[p[t[s[B[u[C[s[2[8[s[K[p[s[p[L[M[                                                                                  ",
-"                                                                                              N[O[P[Q[R[D[S[S[n[C[T[C[B[S[U[V[q[Q[D[R[U[s[R[R[R[C[W[S[X[Y[Z[                                                                              `[ }.}T[R[q[o[V[T[D[V[C[S[V[S[D[R[T[C[R[R[r[B[T[q[r[S[V[+}@}                                                                              #}$}%}R[S[S[S[W[V[C[R[V[s[o[Q[s[p[S[V[S[B[R[&}S[S[S[S[%}*}=}                                                                                ",
-"                                                                                                -};}>},},},}&}s[&}'}V[T['})}'}&},}'},}'},})}&}&}'}&}&}C[!}~}                                                                                {}]},}&}&}'})})}&}'}R[)}&},}'}U[,},}'}&}D[Q['}T[V['})},}^}/}                                                                            (}_}:}<}[}R['}U['}&}'}'}}}&}&}Q[s[,},}&}&}[})},}'}W[,}&}|}1}2}                                                                              ",
-"                                                                                                  3}4}5}6})}7}[}8}7})})}7}V[7}[}9}T[U[7}[}Q['}6})}7}0}[}a}b}c}                                                                              d}e}f}g}9}9},}V['}0}&}}}9}8}}})}[}9})}8})}7}7})}9}9}&}&}h}i}j}                                                                            k}l}m}6})}R[,}8}9}6})}9}7}8}9}[}7})}9})}9}}}'}6})}R['}8}n};}o}                                                                            ",
-"                                                                                                    p}q},}9}r}9}8}s}t}8}7}8}t}8}t}u}t}s}8},}8}v}U[&}s}9}9}w}x}y}                                                                              z}A}B}C}8}D}t}t}s}u}t}s}r},}'}s}8},}v}u}7}t}s}u}7}7}t}0}E}F}G}                                                                            H}I}J}t}7}s}r}8}T[t}s})}s}u})}u}s}s}7}8}u}s}s}t}t}s}r}a}K}L}                                                                            ",
-"                                                                                                    M}N}O}s}r}9}8}r}s}u}s}P}Q}t}R}R}s}Q}S}s}s}T}U}v}T}8}r}r}V}W}X}                                                                              Y}Z}`}u}P} |t}P}S}r}v}S}.|t}Q}r}r}v}8}7}r}r}8}t}R}S}t}r}+|@|#|                                                                            $|%|Q}v}r}P}R}U}v}s}s}r}u}U[s}r}r}u}v} |r}&| |v}r}.|S}s}*|=|                                                                          ",
-"                                                                                                      -|;|>|S}v} |S}.|S}Q}R} |Q}T}P},|v}P}S},|P}'|)|P}S}'|)|P}!|~|{|                                                                              ]|^|/|T}.|S}&|P}S}P}T}P},|P}P}'| |v}S})|Q} |Q}P} |P}T}R}(|_|                                                                              :|<|R}S}v}P} |.|R},|,|Q}R}'|Q}.|S}P}S}S}T}U}P}S}T}T} |[|}|||                                                                        ",
-"                                                                                                        1|2|3| |4|5|4|6|)|7|8|4|,|7|8| |)|S}9|4|4|7|'| |9|9| |7|0|a|                                                                                b|c|d|8|9|,|7|4|6|)|.|9|)|'|7|5|)|e|e|)|9|'|7|f|e|,|7|5|g|h|                                                                            i|j|+|e|S}7|7|e|)|)|9|)|7|9|7|8|4|5|4|8|'|'|5|f|'|,|)|4|k|l|m|                                                                      ",
-"                                                                                                          n|o|p|6|4|6|9|4|6|e|'|q|4|R}4|r|5|9|r|4|5|9|9|9|5|4|4|7|s|t|                                                                              u|v|w|4|'|6|q| |7|q|7|4|q|q|)|4|e|9|4|4|e|4|9|9|)|8|8|P}x|y|z|                                                                            A|B|C|D|8|4|r|f|)|4|7|'|9|9|6|6|9|9|5|5|r| | |q|9|'|8|E|F|G|H|                                                                    ",
-"                                                                                                            I|J|K|L|M|M|M|M|M|r|N|O|9|r|O|M|M|M|r|M|M|E|P|M|q|O|Q|R|S|T|                                                                              U|V|W|E|r|M|8|8|M|M|M|O|r|M|O|q|Q|O|O|M|M|O|M|r|M|M|8|9|X|Y|Z|                                                                            `| 1.1q|O|Q|q|Q|O|q|r|+1O|M|M|M|M|M|r|O|r|8|O|M|M|M|L|N|@1#1                                                                    ",
-"                                                                                                            $1%1&1L|O|O|r|r|+1q|8|O|+1e|q|O|M|q|M|Q|r|q|Q|+1E|Q|M|r|*1=1-1                                                                              ;1>1,1'|r|+1q|5|O|O|q|r|O|M|8|O|Q|M|O|r|r|O|M|6|r|Q|8|e|'1)1                                                                              !1~1{1O|M|q|Q|Q|r|M|Q|M|O|r|r|M|+19|9|O|O|7|M|Q|M|q|Q|*1]1^1                                                                  ",
-"                                                                                                              /1(1_1+1:1+1+1P|P|:1+1+1:1:1Q|P|+1Q|M|Q|O|O|M|Q|P|+1Q|<1[1}1|1                                                                              112131P|Q|P|P|Q|P|+1:1Q|+1Q|Q|O|Q|:1P|Q|P|:1:1P|+1:1:1415161                                                                            71819141P|Q|Q|Q|+1O|Q|Q|P|:1:1+1P|:1:1Q|P|+1P|+1P|P|Q|Q|01a1b1                                                                ",
-"                                                                                                                c1d1[1P|:1:1+1P|e1P|M|P|f1:1:1f1e1f1:1f1f1f1f1f1f1:1+1g1h1i1                                                                                j1k1l1P|P|f1:1:1m1:1:1f1f1f1f1:1P|:1:1P|Q|f1:1O|+1f1<1<1n1o1                                                                            p1q1r1e1f1e1f1f1f1e1f1P|f1:1P|Q|:1e1:1Q|f1:1:1e1e1:1e1s1t1u1v1                                                              ",
-"                                                                                                                  w1x1y1m1m1m1m1z1z1f1m1A1m1f1e1m1z1e1A1A1z1m1A1A1m1z1z1B1C1D1                                                                              E1F1G1H1m1z1m1m1e1m1m1m1z1A1A1m1A1m1m1m1e1m1A1e1e1A1z1e1I1J1K1                                                                            L1M1N1e1A1A1e1A1A1e1m1m1m1m1m1m1A1m1m1z1m1m1e1e1m1m1m1z1O1P1Q1                                                            "};
diff --git a/SampleERCP/icons/app/ico_32t.png b/SampleERCP/icons/app/ico_32t.png
deleted file mode 100644 (file)
index 6dff716..0000000
Binary files a/SampleERCP/icons/app/ico_32t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_48t.png b/SampleERCP/icons/app/ico_48t.png
deleted file mode 100644 (file)
index 692a991..0000000
Binary files a/SampleERCP/icons/app/ico_48t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_64t.png b/SampleERCP/icons/app/ico_64t.png
deleted file mode 100644 (file)
index 338d6ca..0000000
Binary files a/SampleERCP/icons/app/ico_64t.png and /dev/null differ
diff --git a/SampleERCP/icons/app/ico_all.ico b/SampleERCP/icons/app/ico_all.ico
deleted file mode 100644 (file)
index b6884e1..0000000
Binary files a/SampleERCP/icons/app/ico_all.ico and /dev/null differ
diff --git a/SampleERCP/icons/embedded.png b/SampleERCP/icons/embedded.png
deleted file mode 100644 (file)
index 57edc6a..0000000
Binary files a/SampleERCP/icons/embedded.png and /dev/null differ
diff --git a/SampleERCP/icons/enterprise.png b/SampleERCP/icons/enterprise.png
deleted file mode 100644 (file)
index 7fe2f5c..0000000
Binary files a/SampleERCP/icons/enterprise.png and /dev/null differ
diff --git a/SampleERCP/icons/home.png b/SampleERCP/icons/home.png
deleted file mode 100644 (file)
index e9ace41..0000000
Binary files a/SampleERCP/icons/home.png and /dev/null differ
diff --git a/SampleERCP/icons/languages.png b/SampleERCP/icons/languages.png
deleted file mode 100644 (file)
index 98af2da..0000000
Binary files a/SampleERCP/icons/languages.png and /dev/null differ
diff --git a/SampleERCP/icons/open_in_app.png b/SampleERCP/icons/open_in_app.png
deleted file mode 100644 (file)
index 9df4eeb..0000000
Binary files a/SampleERCP/icons/open_in_app.png and /dev/null differ
diff --git a/SampleERCP/icons/rcp.png b/SampleERCP/icons/rcp.png
deleted file mode 100644 (file)
index b248ca2..0000000
Binary files a/SampleERCP/icons/rcp.png and /dev/null differ
diff --git a/SampleERCP/icons/save_edit.png b/SampleERCP/icons/save_edit.png
deleted file mode 100644 (file)
index b17caf5..0000000
Binary files a/SampleERCP/icons/save_edit.png and /dev/null differ
diff --git a/SampleERCP/net.mograsim.rcp.product b/SampleERCP/net.mograsim.rcp.product
deleted file mode 100644 (file)
index 829a7b5..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.5"?>
-
-<product name="Simulator WIP" uid="sample" id="net.mograsim.rcp.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
-
-   <aboutInfo>
-      <text>
-         Example
-      </text>
-   </aboutInfo>
-
-   <configIni use="default">
-   </configIni>
-
-   <launcherArgs>
-      <programArgs>-clearPersistedState
-      </programArgs>
-      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
-      </vmArgsMac>
-   </launcherArgs>
-
-   <windowImages i16="/net.mograsim.rcp/icons/app/ico_16t.png" i32="/net.mograsim.rcp/icons/app/ico_32t.png" i48="/net.mograsim.rcp/icons/app/ico_48t.png" i64="/net.mograsim.rcp/icons/app/ico_64t.png" i128="/net.mograsim.rcp/icons/app/ico_128t.png" i256="/net.mograsim.rcp/icons/app/ico_256t.png"/>
-
-   <splash
-      handlerType="extensible" />
-   <launcher name="Sample">
-      <linux icon="/net.mograsim.rcp/icons/app/ico_256t.xpm"/>
-      <macosx icon="/net.mograsim.rcp/icons/app/ico_256t.icns"/>
-      <win useIco="true">
-         <ico path="/net.mograsim.rcp/icons/app/ico_all.ico"/>
-         <bmp/>
-      </win>
-   </launcher>
-
-
-   <vm>
-      <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</linux>
-      <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</macos>
-      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</windows>
-   </vm>
-
-   <license>
-        <url>https://www.eclipse.org/legal/epl-2.0/</url>
-        <text>
-   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
-         </text>
-   </license>
-
-   <plugins>
-      <plugin id="SWTBufferedCanvas"/>
-      <plugin id="SWTObjectWrappers"/>
-      <plugin id="SWTZoomableCanvas"/>
-      <plugin id="com.ibm.icu"/>
-      <plugin id="javax.annotation"/>
-      <plugin id="javax.inject"/>
-      <plugin id="javax.xml"/>
-      <plugin id="net.mograsim.logic.core"/>
-      <plugin id="net.mograsim.logic.ui"/>
-      <plugin id="net.mograsim.rcp"/>
-      <plugin id="org.apache.batik.constants"/>
-      <plugin id="org.apache.batik.css"/>
-      <plugin id="org.apache.batik.i18n"/>
-      <plugin id="org.apache.batik.util"/>
-      <plugin id="org.apache.commons.io"/>
-      <plugin id="org.apache.commons.jxpath"/>
-      <plugin id="org.apache.commons.logging"/>
-      <plugin id="org.apache.xmlgraphics"/>
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.contenttype"/>
-      <plugin id="org.eclipse.core.databinding"/>
-      <plugin id="org.eclipse.core.databinding.observable"/>
-      <plugin id="org.eclipse.core.databinding.property"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.jobs"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.e4.core.commands"/>
-      <plugin id="org.eclipse.e4.core.contexts"/>
-      <plugin id="org.eclipse.e4.core.di"/>
-      <plugin id="org.eclipse.e4.core.di.annotations"/>
-      <plugin id="org.eclipse.e4.core.di.extensions"/>
-      <plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
-      <plugin id="org.eclipse.e4.core.services"/>
-      <plugin id="org.eclipse.e4.emf.xpath"/>
-      <plugin id="org.eclipse.e4.ui.bindings"/>
-      <plugin id="org.eclipse.e4.ui.css.core"/>
-      <plugin id="org.eclipse.e4.ui.css.swt"/>
-      <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
-      <plugin id="org.eclipse.e4.ui.di"/>
-      <plugin id="org.eclipse.e4.ui.model.workbench"/>
-      <plugin id="org.eclipse.e4.ui.services"/>
-      <plugin id="org.eclipse.e4.ui.widgets"/>
-      <plugin id="org.eclipse.e4.ui.workbench"/>
-      <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
-      <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
-      <plugin id="org.eclipse.e4.ui.workbench.swt"/>
-      <plugin id="org.eclipse.e4.ui.workbench3"/>
-      <plugin id="org.eclipse.emf.common"/>
-      <plugin id="org.eclipse.emf.ecore"/>
-      <plugin id="org.eclipse.emf.ecore.change"/>
-      <plugin id="org.eclipse.emf.ecore.xmi"/>
-      <plugin id="org.eclipse.equinox.app"/>
-      <plugin id="org.eclipse.equinox.common"/>
-      <plugin id="org.eclipse.equinox.preferences"/>
-      <plugin id="org.eclipse.equinox.region" fragment="true"/>
-      <plugin id="org.eclipse.equinox.registry"/>
-      <plugin id="org.eclipse.equinox.supplement"/>
-      <plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
-      <plugin id="org.eclipse.equinox.weaving.hook" fragment="true"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.jface.databinding"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
-      <plugin id="org.eclipse.osgi.services"/>
-      <plugin id="org.eclipse.osgi.util"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-      <plugin id="org.w3c.css.sac"/>
-      <plugin id="org.w3c.dom.events"/>
-      <plugin id="org.w3c.dom.smil"/>
-      <plugin id="org.w3c.dom.svg"/>
-   </plugins>
-
-   <configurations>
-      <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
-   </configurations>
-
-   <preferencesInfo>
-      <targetfile overwrite="false"/>
-   </preferencesInfo>
-
-   <cssInfo>
-      <file path="/net.mograsim.rcp/css/default.css"/>
-   </cssInfo>
-
-</product>
diff --git a/SampleERCP/plugin.xml b/SampleERCP/plugin.xml
deleted file mode 100644 (file)
index a22663b..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension-point id="splashExtension" name="%extension-point.name" schema="schema/splashExtension.exsd"/>
-
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.e4.ui.workbench.swt.E4Application"
-            name="Simulator WIP">
-         <property
-               name="applicationCSS"
-               value="platform:/plugin/net.mograsim.rcp/css/default.css">
-         </property>
-         <property
-               name="appName"
-               value="Simulator WIP">
-         </property>
-         <property
-               name="windowImages"
-               value="icons/app/ico_16t.png,icons/app/ico_32t.png,icons/app/ico_48t.png,icons/app/ico_64t.png,icons/app/ico_128t.png,icons/app/ico_256t.png">
-         </property>
-         <property
-               name="aboutText"
-               value="Example">
-         </property>
-      </product>
-   </extension>
-   <extension
-         point="org.eclipse.ui.splashHandlers">
-      <splashHandler
-            class="net.mograsim.rcp.splashhandlers.ExtensibleSplashHandler"
-            id="net.mograsim.rcp.splashHandlers.extensible">
-      </splashHandler>
-      <splashHandlerProductBinding
-            productId="net.mograsim.rcp.product"
-            splashId="net.mograsim.rcp.splashHandlers.extensible">
-      </splashHandlerProductBinding>
-   </extension>
-   <extension
-         point="net.mograsim.rcp.splashExtension">
-      <splashExtension
-            icon="icons/af.png"
-            id="af"
-            tooltip="Application Framework">
-      </splashExtension>
-      <splashExtension
-            icon="icons/embedded.png"
-            id="embedded"
-            tooltip="Embedded">
-      </splashExtension>
-      <splashExtension
-            icon="icons/enterprise.png"
-            id="enterprise"
-            tooltip="Enterprise">
-      </splashExtension>
-      <splashExtension
-            icon="icons/languages.png"
-            id="languages"
-            tooltip="Languages">
-      </splashExtension>
-      <splashExtension
-            icon="icons/rcp.png"
-            id="rcp"
-            tooltip="RCP">
-      </splashExtension>
-   </extension>
-
-</plugin>
diff --git a/SampleERCP/schema/splashExtension.exsd b/SampleERCP/schema/splashExtension.exsd
deleted file mode 100644 (file)
index ea0d2b5..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="Sample">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="Sample" id="splashExtension" name="Splash Extensions"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="splashExtension"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="splashExtension">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="id" icon="icon"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  50x50 icon
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/SampleERCP/splash.bmp b/SampleERCP/splash.bmp
deleted file mode 100644 (file)
index 6a5df0a..0000000
Binary files a/SampleERCP/splash.bmp and /dev/null differ
diff --git a/SampleERCP/src/net/mograsim/rcp/handlers/AboutHandler.java b/SampleERCP/src/net/mograsim/rcp/handlers/AboutHandler.java
deleted file mode 100644 (file)
index 25a6663..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class AboutHandler
-{
-       @Execute
-       public void execute(Shell shell)
-       {
-               MessageDialog.openInformation(shell, "About", "Sample RCP4");
-       }
-}
diff --git a/SampleERCP/src/net/mograsim/rcp/handlers/OpenHandler.java b/SampleERCP/src/net/mograsim/rcp/handlers/OpenHandler.java
deleted file mode 100644 (file)
index 7df311a..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class OpenHandler
-{
-
-       @Execute
-       public void execute(Shell shell)
-       {
-               FileDialog dialog = new FileDialog(shell);
-               dialog.open();
-       }
-}
diff --git a/SampleERCP/src/net/mograsim/rcp/handlers/QuitHandler.java b/SampleERCP/src/net/mograsim/rcp/handlers/QuitHandler.java
deleted file mode 100644 (file)
index c953e5a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.e4.ui.workbench.IWorkbench;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class QuitHandler
-{
-       @Execute
-       public void execute(IWorkbench workbench, Shell shell)
-       {
-               if (MessageDialog.openConfirm(shell, "Confirmation", "Do you want to exit?"))
-               {
-                       workbench.close();
-               }
-       }
-}
diff --git a/SampleERCP/src/net/mograsim/rcp/handlers/SaveHandler.java b/SampleERCP/src/net/mograsim/rcp/handlers/SaveHandler.java
deleted file mode 100644 (file)
index e662d6b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.CanExecute;
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.e4.ui.workbench.modeling.EPartService;
-
-public class SaveHandler
-{
-
-       @CanExecute
-       public boolean canExecute(EPartService partService)
-       {
-               if (partService != null)
-               {
-                       return !partService.getDirtyParts().isEmpty();
-               }
-               return false;
-       }
-
-       @Execute
-       public void execute(EPartService partService)
-       {
-               partService.saveAll(false);
-       }
-}
\ No newline at end of file
diff --git a/SampleERCP/src/net/mograsim/rcp/parts/LogicUIPart.java b/SampleERCP/src/net/mograsim/rcp/parts/LogicUIPart.java
deleted file mode 100644 (file)
index d23c9f4..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-package net.mograsim.rcp.parts;
-
-import javax.annotation.PostConstruct;
-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 net.mograsim.logic.ui.LogicExecuter;
-import net.mograsim.logic.ui.LogicUICanvas;
-import net.mograsim.logic.ui.examples.RSLatchExample;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
-import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
-import net.mograsim.logic.core.timeline.Timeline;
-
-public class LogicUIPart
-{
-       @Inject
-       private MPart part;
-
-       @PostConstruct
-       public void create(Composite parent)
-       {
-               // setup view model
-               ViewModel viewModel = new ViewModel();
-               RSLatchExample.createRSLatchExample(viewModel);
-
-               // convert to logic model
-               LogicModelParameters params = new LogicModelParameters();
-               params.gateProcessTime = 50;
-               params.wireTravelTime = 10;
-               Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
-
-               // initialize UI
-               LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE, viewModel);
-               ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
-               ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
-               userInput.buttonDrag = 3;
-               userInput.buttonZoom = 2;
-               userInput.enableUserInput();
-
-               // initialize executer
-               LogicExecuter exec = new LogicExecuter(timeline);
-
-               // run it
-               exec.startLiveExecution();
-
-               // TODO find a better condition when to stop
-               ui.addDisposeListener(e -> exec.stopLiveExecution());
-       }
-}
\ No newline at end of file
diff --git a/SampleERCP/src/net/mograsim/rcp/parts/SamplePart.java b/SampleERCP/src/net/mograsim/rcp/parts/SamplePart.java
deleted file mode 100644 (file)
index 0bbe8aa..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.mograsim.rcp.parts;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-
-import org.eclipse.e4.ui.di.Focus;
-import org.eclipse.e4.ui.di.Persist;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-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.Text;
-
-public class SamplePart
-{
-
-       private TableViewer tableViewer;
-
-       @Inject
-       private MPart part;
-
-       @PostConstruct
-       public void createComposite(Composite parent)
-       {
-               parent.setLayout(new GridLayout(1, false));
-
-               Text txtInput = new Text(parent, SWT.BORDER);
-               txtInput.setMessage("Enter text to mark part as dirty");
-               txtInput.addModifyListener(e -> part.setDirty(true));
-               txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-               tableViewer = new TableViewer(parent);
-
-               tableViewer.setContentProvider(ArrayContentProvider.getInstance());
-               tableViewer.setInput(createInitialDataModel());
-               tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
-       }
-
-       @Focus
-       public void setFocus()
-       {
-               tableViewer.getTable().setFocus();
-       }
-
-       @Persist
-       public void save()
-       {
-               part.setDirty(false);
-       }
-
-       private static List<String> createInitialDataModel()
-       {
-               return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");
-       }
-}
\ No newline at end of file
diff --git a/SampleERCP/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java b/SampleERCP/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java
deleted file mode 100644 (file)
index 17d4ea5..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-package net.mograsim.rcp.splashhandlers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.splash.AbstractSplashHandler;
-
-/**
- * @since 3.3
- *
- */
-public class ExtensibleSplashHandler extends AbstractSplashHandler
-{
-
-       private ArrayList<Image> fImageList;
-
-       private ArrayList<String> fTooltipList;
-
-       private static final String F_SPLASH_EXTENSION_ID = "Sample.splashExtension"; // NON-NLS-1
-
-       private static final String F_ELEMENT_ICON = "icon"; // NON-NLS-1
-
-       private static final String F_ELEMENT_TOOLTIP = "tooltip"; // NON-NLS-1
-
-       private static final String F_DEFAULT_TOOLTIP = "Image"; // NON-NLS-1
-
-       private static final int F_IMAGE_WIDTH = 50;
-
-       private static final int F_IMAGE_HEIGHT = 50;
-
-       private static final int F_SPLASH_SCREEN_BEVEL = 5;
-
-       private Composite fIconPanel;
-
-       /**
-        * 
-        */
-       public ExtensibleSplashHandler()
-       {
-               fImageList = new ArrayList<>();
-               fTooltipList = new ArrayList<>();
-               fIconPanel = null;
-       }
-
-       /*
-        * (non-Javadoc)
-        * 
-        * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets. Shell)
-        */
-       @Override
-       public void init(Shell splash)
-       {
-               // Store the shell
-               super.init(splash);
-               // Configure the shell layout
-               configureUISplash();
-               // Load all splash extensions
-               loadSplashExtensions();
-               // If no splash extensions were loaded abort the splash handler
-               if (!hasSplashExtensions())
-               {
-                       return;
-               }
-               // Create UI
-               createUI();
-               // Configure the image panel bounds
-               configureUICompositeIconPanelBounds();
-               // Enter event loop and prevent the RCP application from
-               // loading until all work is done
-               doEventLoop();
-       }
-
-       /**
-        * @return
-        */
-       private boolean hasSplashExtensions()
-       {
-               return !fImageList.isEmpty();
-       }
-
-       /**
-        * 
-        */
-       private void createUI()
-       {
-               // Create the icon panel
-               createUICompositeIconPanel();
-               // Create the images
-               createUIImages();
-       }
-
-       /**
-        * 
-        */
-       private void createUIImages()
-       {
-               Iterator<Image> imageIterator = fImageList.iterator();
-               Iterator<String> tooltipIterator = fTooltipList.iterator();
-               int i = 1;
-               int columnCount = ((GridLayout) fIconPanel.getLayout()).numColumns;
-               // Create all the images
-               // Abort if we run out of columns (left-over images will not fit within
-               // the usable splash screen width)
-               while (imageIterator.hasNext() && (i <= columnCount))
-               {
-                       Image image = imageIterator.next();
-                       String tooltip = tooltipIterator.next();
-                       // Create the image using a label widget
-                       createUILabel(image, tooltip);
-                       i++;
-               }
-       }
-
-       /**
-        * @param image
-        * @param tooltip
-        */
-       private void createUILabel(Image image, String tooltip)
-       {
-               // Create the label (no text)
-               Label label = new Label(fIconPanel, SWT.NONE);
-               label.setImage(image);
-               label.setToolTipText(tooltip);
-       }
-
-       /**
-        * 
-        */
-       private void createUICompositeIconPanel()
-       {
-               Shell splash = getSplash();
-               // Create the composite
-               fIconPanel = new Composite(splash, SWT.NONE);
-               // Determine the maximum number of columns that can fit on the splash
-               // screen. One 50x50 image per column.
-               int maxColumnCount = getUsableSplashScreenWidth() / F_IMAGE_WIDTH;
-               // Limit size to the maximum number of columns if the number of images
-               // exceed this amount; otherwise, use the exact number of columns
-               // required.
-               int actualColumnCount = Math.min(fImageList.size(), maxColumnCount);
-               // Configure the layout
-               GridLayout layout = new GridLayout(actualColumnCount, true);
-               layout.horizontalSpacing = 0;
-               layout.verticalSpacing = 0;
-               layout.marginHeight = 0;
-               layout.marginWidth = 0;
-               fIconPanel.setLayout(layout);
-       }
-
-       /**
-        * 
-        */
-       private void configureUICompositeIconPanelBounds()
-       {
-               // Determine the size of the panel and position it at the bottom-right
-               // of the splash screen.
-               Point panelSize = fIconPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-
-               int xCoord = getSplash().getSize().x - F_SPLASH_SCREEN_BEVEL - panelSize.x;
-               int yCoord = getSplash().getSize().y - F_SPLASH_SCREEN_BEVEL - panelSize.y;
-               int xWidth = panelSize.x;
-               int yWidth = panelSize.y;
-
-               fIconPanel.setBounds(xCoord, yCoord, xWidth, yWidth);
-       }
-
-       /**
-        * @return
-        */
-       private int getUsableSplashScreenWidth()
-       {
-               // Splash screen width minus two graphic border bevel widths
-               return getSplash().getSize().x - (F_SPLASH_SCREEN_BEVEL * 2);
-       }
-
-       /**
-        * 
-        */
-       private void loadSplashExtensions()
-       {
-               // Get all splash handler extensions
-               IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();
-               // Process all splash handler extensions
-               for (int i = 0; i < extensions.length; i++)
-               {
-                       processSplashExtension(extensions[i]);
-               }
-       }
-
-       /**
-        * @param extension
-        */
-       private void processSplashExtension(IExtension extension)
-       {
-               // Get all splash handler configuration elements
-               IConfigurationElement[] elements = extension.getConfigurationElements();
-               // Process all splash handler configuration elements
-               for (int j = 0; j < elements.length; j++)
-               {
-                       processSplashElements(elements[j]);
-               }
-       }
-
-       /**
-        * @param configurationElement
-        */
-       private void processSplashElements(IConfigurationElement configurationElement)
-       {
-               // Attribute: icon
-               processSplashElementIcon(configurationElement);
-               // Attribute: tooltip
-               processSplashElementTooltip(configurationElement);
-       }
-
-       /**
-        * @param configurationElement
-        */
-       private void processSplashElementTooltip(IConfigurationElement configurationElement)
-       {
-               // Get attribute tooltip
-               String tooltip = configurationElement.getAttribute(F_ELEMENT_TOOLTIP);
-               // If a tooltip is not defined, give it a default
-               if ((tooltip == null) || (tooltip.length() == 0))
-               {
-                       fTooltipList.add(F_DEFAULT_TOOLTIP);
-               } else
-               {
-                       fTooltipList.add(tooltip);
-               }
-       }
-
-       /**
-        * @param configurationElement
-        */
-       private void processSplashElementIcon(IConfigurationElement configurationElement)
-       {
-               // Get attribute icon
-               String iconImageFilePath = configurationElement.getAttribute(F_ELEMENT_ICON);
-               // Abort if an icon attribute was not specified
-               if ((iconImageFilePath == null) || (iconImageFilePath.length() == 0))
-               {
-                       return;
-               }
-               // Create a corresponding image descriptor
-               ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getNamespaceIdentifier(),
-                               iconImageFilePath);
-               // Abort if no corresponding image was found
-               if (descriptor == null)
-               {
-                       return;
-               }
-               // Create the image
-               Image image = descriptor.createImage();
-               // Abort if image creation failed
-               if (image == null)
-               {
-                       return;
-               }
-               // Abort if the image does not have dimensions of 50x50
-               if ((image.getBounds().width != F_IMAGE_WIDTH) || (image.getBounds().height != F_IMAGE_HEIGHT))
-               {
-                       // Dipose of the image
-                       image.dispose();
-                       return;
-               }
-               // Store the image and tooltip
-               fImageList.add(image);
-       }
-
-       /**
-        * 
-        */
-       private void configureUISplash()
-       {
-               // Configure layout
-               GridLayout layout = new GridLayout(1, true);
-               getSplash().setLayout(layout);
-               // Force shell to inherit the splash background
-               getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT);
-       }
-
-       /**
-        * 
-        */
-       private void doEventLoop()
-       {
-               Shell splash = getSplash();
-               if (!splash.getDisplay().readAndDispatch())
-               {
-                       splash.getDisplay().sleep();
-               }
-       }
-
-       /*
-        * (non-Javadoc)
-        * 
-        * @see org.eclipse.ui.splash.AbstractSplashHandler#dispose()
-        */
-       @Override
-       public void dispose()
-       {
-               super.dispose();
-               // Check to see if any images were defined
-               if ((fImageList == null) || fImageList.isEmpty())
-               {
-                       return;
-               }
-               // Dispose of all the images
-               Iterator<Image> iterator = fImageList.iterator();
-               while (iterator.hasNext())
-               {
-                       Image image = iterator.next();
-                       image.dispose();
-               }
-       }
-}
diff --git a/era.mi/.classpath b/era.mi/.classpath
deleted file mode 100644 (file)
index dd2ee31..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
-               <attributes>
-                       <attribute name="module" value="true"/>
-               </attributes>
-       </classpathentry>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/era.mi/.gitignore b/era.mi/.gitignore
deleted file mode 100644 (file)
index f59a3a7..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/bin/
-*.class
-*.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/era.mi/.project b/era.mi/.project
deleted file mode 100644 (file)
index 783f7c7..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>net.mograsim.logic.core</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-               <nature>org.eclipse.pde.PluginNature</nature>
-       </natures>
-</projectDescription>
diff --git a/era.mi/.settings/org.eclipse.jdt.core.prefs b/era.mi/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644 (file)
index 020d558..0000000
+++ /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=10
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=10
-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=10
-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/era.mi/.settings/org.eclipse.jdt.ui.prefs b/era.mi/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644 (file)
index 9465882..0000000
+++ /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/era.mi/META-INF/MANIFEST.MF b/era.mi/META-INF/MANIFEST.MF
deleted file mode 100644 (file)
index 655b575..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: net.mograsim.logic.core
-Bundle-SymbolicName: net.mograsim.logic.core
-Bundle-Version: 1.0.0.qualifier
-Export-Package: net.mograsim.logic.core,
- net.mograsim.logic.core.components,
- net.mograsim.logic.core.components.gates,
- net.mograsim.logic.core.tests,
- net.mograsim.logic.core.timeline,
- net.mograsim.logic.core.types,
- net.mograsim.logic.core.wires
-Bundle-RequiredExecutionEnvironment: JavaSE-10
-Automatic-Module-Name: net.mograsim.logic.core
diff --git a/era.mi/build.properties b/era.mi/build.properties
deleted file mode 100644 (file)
index b107977..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-source.. = src/
-bin.includes = META-INF/,\
-               .
diff --git a/era.mi/src/net/mograsim/logic/core/Util.java b/era.mi/src/net/mograsim/logic/core/Util.java
deleted file mode 100644 (file)
index dd3671c..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.mograsim.logic.core;
-
-import java.util.Arrays;
-
-import net.mograsim.logic.core.types.Bit;
-
-public final class Util
-{
-
-       @SuppressWarnings("unchecked")
-       public static <T> T[] concat(T[]... arrays)
-       {
-               if (arrays.length == 0)
-                       throw new IllegalArgumentException("Cannot concatenate 0 arrays.");
-
-               int length = 0;
-               for (T[] array : arrays)
-                       length += array.length;
-
-               T[] newArray = Arrays.copyOf(arrays[0], length);
-               int appendIndex = arrays[0].length;
-               for (int i = 1; i < arrays.length; i++)
-               {
-                       System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);
-                       appendIndex += arrays[i].length;
-               }
-
-               return newArray;
-       }
-
-//     @SuppressWarnings("unchecked")
-//     public static <T> T[][] split(T[] array, int... lengths)
-//     {
-//             //TODO: implement array split again; This version contains an illegal cast
-//             int totalLength = 0;
-//             for(int length : lengths)
-//                     totalLength += length;
-//             
-//             if(totalLength != array.length)
-//                     throw new IllegalArgumentException(); //TODO: add proper error message
-//             
-//             Object[][] newArray = new Object[lengths.length][];
-//             int splitIndex = 0;
-//             for(int i = 0; i < lengths.length; i++)
-//             {
-//                     System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);
-//                     splitIndex += lengths[i];
-//             }
-//             
-//             return (T[][]) newArray;
-//     }
-
-       public static Bit[] and(Bit[] a, Bit[] b)
-       {
-               return binBitOp(a, b, Bit::and);
-       }
-
-       public static Bit[] or(Bit[] a, Bit[] b)
-       {
-               return binBitOp(a, b, Bit::or);
-       }
-
-       public static Bit[] xor(Bit[] a, Bit[] b)
-       {
-               return binBitOp(a, b, Bit::xor);
-       }
-
-       private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)
-       {
-               if (a.length != b.length)
-                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");
-               Bit[] out = new Bit[a.length];
-               for (int i = 0; i < a.length; i++)
-               {
-                       out[i] = op.execute(a[i], b[i]);
-               }
-               return out;
-       }
-
-       public static Bit[] not(Bit[] a)
-       {
-               Bit[] out = new Bit[a.length];
-               for (int i = 0; i < a.length; i++)
-               {
-                       out[i] = a[i].not();
-               }
-               return out;
-       }
-
-       /**
-        * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array.
-        * 
-        * @author Christian Femers
-        */
-       public static Bit[] combineInto(Bit[] dest, Bit[] addition)
-       {
-               if (dest.length != addition.length)
-                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");
-               for (int i = 0; i < addition.length; i++)
-               {
-                       dest[i] = dest[i].join(addition[i]);
-               }
-               return dest;
-       }
-
-       interface BitOp
-       {
-               Bit execute(Bit a, Bit b);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/BasicComponent.java b/era.mi/src/net/mograsim/logic/core/components/BasicComponent.java
deleted file mode 100644 (file)
index 426c6a1..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-/**
- * A basic component that recomputes all outputs (with a delay), when it is updated.
- * 
- * @author Fabian Stemmler
- */
-public abstract class BasicComponent extends Component implements WireObserver
-{
-       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 BasicComponent(Timeline timeline, int processTime)
-       {
-               super(timeline);
-               this.processTime = processTime > 0 ? processTime : 1;
-       }
-
-       @Override
-       public void update(ReadEnd initiator, BitVector oldValues)
-       {
-               timeline.addEvent(e -> compute(), processTime);
-       }
-
-       protected abstract void compute();
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/BitDisplay.java b/era.mi/src/net/mograsim/logic/core/components/BitDisplay.java
deleted file mode 100644 (file)
index 268d157..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-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.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class BitDisplay extends BasicComponent
-{
-       private final ReadEnd in;
-       private BitVector displayedValue;
-
-       public BitDisplay(Timeline timeline, ReadEnd in)
-       {
-               super(timeline, 1);
-               this.in = in;
-               in.addObserver(this);
-               compute();
-       }
-
-       @Override
-       protected void compute()
-       {
-               displayedValue = in.getValues();
-       }
-
-       public BitVector getDisplayedValue()
-       {
-               return displayedValue;
-       }
-
-       public boolean isDisplaying(Bit... values)
-       {
-               return displayedValue.equals(BitVector.of(values));
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(in);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of();
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Clock.java b/era.mi/src/net/mograsim/logic/core/components/Clock.java
deleted file mode 100644 (file)
index 6562135..0000000
+++ /dev/null
@@ -1,61 +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.TimelineEvent;
-import net.mograsim.logic.core.timeline.TimelineEventHandler;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Clock extends Component implements TimelineEventHandler
-{
-       private boolean toggle = false;
-       private ReadWriteEnd out;
-       private int delta;
-
-       /**
-        * 
-        * @param out   {@link Wire} the clock's impulses are fed into
-        * @param delta ticks between rising and falling edge
-        */
-       public Clock(Timeline timeline, ReadWriteEnd out, int delta)
-       {
-               super(timeline);
-               this.delta = delta;
-               this.out = out;
-               addToTimeline();
-       }
-
-       @Override
-       public void handle(TimelineEvent e)
-       {
-               addToTimeline();
-               out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
-               toggle = !toggle;
-       }
-
-       public ReadWriteEnd getOut()
-       {
-               return out;
-       }
-
-       private void addToTimeline()
-       {
-               timeline.addEvent(this, delta);
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of();
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Component.java b/era.mi/src/net/mograsim/logic/core/components/Component.java
deleted file mode 100644 (file)
index 834f4b5..0000000
+++ /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.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public abstract class Component
-{
-       protected Timeline timeline;
-
-       public Component(Timeline timeline)
-       {
-               this.timeline = timeline;
-       }
-
-       /**
-        * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization
-        * in the UI.
-        */
-       public abstract List<ReadEnd> getAllInputs();
-
-       /**
-        * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.
-        */
-       public abstract List<ReadWriteEnd> getAllOutputs();
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Connector.java b/era.mi/src/net/mograsim/logic/core/components/Connector.java
deleted file mode 100644 (file)
index 16b8e70..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Connector extends Component implements WireObserver
-{
-       private boolean connected;
-       private final ReadWriteEnd a;
-       private final ReadWriteEnd b;
-
-       public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
-       {
-               super(timeline);
-               if (a.length() != b.length())
-                       throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
-               this.a = a;
-               this.b = b;
-               a.addObserver(this);
-               b.addObserver(this);
-       }
-
-       public void connect()
-       {
-               connected = true;
-               update(a);
-               update(b);
-       }
-
-       public void disconnect()
-       {
-               connected = false;
-               a.clearSignals();
-               b.clearSignals();
-       }
-
-       public void setConnection(boolean connected)
-       {
-               if (connected)
-                       connect();
-               else
-                       disconnect();
-       }
-
-       @Override
-       public void update(ReadEnd initiator, BitVector oldValues)
-       {
-               if (connected)
-                       timeline.addEvent(e -> update(initiator), 1);
-       }
-
-       private void update(ReadEnd initiator)
-       {
-               if (initiator == a)
-                       b.feedSignals(a.wireValuesExcludingMe());
-               else
-                       a.feedSignals(b.wireValuesExcludingMe());
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(a, b);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(a, b);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Demux.java b/era.mi/src/net/mograsim/logic/core/components/Demux.java
deleted file mode 100644 (file)
index 5da1bf6..0000000
+++ /dev/null
@@ -1,82 +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.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
- * output.
- * 
- * @author Fabian Stemmler
- *
- */
-public class Demux extends BasicComponent
-{
-       private final ReadEnd select, in;
-       private final ReadWriteEnd[] outputs;
-       private final int outputSize;
-       private int selected = -1;
-
-       /**
-        * Output {@link Wire}s and in must be of uniform length
-        * 
-        * @param in      Must be of uniform length 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 Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
-       {
-               super(timeline, processTime);
-               outputSize = in.length();
-
-               this.in = in;
-               this.outputs = outputs;
-               for (int i = 0; i < this.outputs.length; i++)
-               {
-                       if (outputs[i].length() != outputSize)
-                               throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");
-                       this.outputs[i] = outputs[i];
-               }
-
-               this.select = select;
-               select.addObserver(this);
-
-               int maxInputs = 1 << select.length();
-               if (this.outputs.length > maxInputs)
-                       throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by "
-                                       + select.length() + " select bits (" + maxInputs + ").");
-               in.addObserver(this);
-       }
-
-       @Override
-       public void compute()
-       {
-               int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;
-               if (selectValue >= outputs.length)
-                       selectValue = -1;
-
-               if (selected != selectValue && selected != -1)
-                       outputs[selected].clearSignals();
-
-               selected = selectValue;
-
-               if (selectValue != -1)
-                       outputs[selectValue].feedSignals(in.getValues());
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(in, select);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(outputs);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/ManualSwitch.java b/era.mi/src/net/mograsim/logic/core/components/ManualSwitch.java
deleted file mode 100644 (file)
index fc6e943..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * This class models a simple on/off (ONE/ZERO) switch for user interaction.
- *
- * @author Christian Femers
- *
- */
-public class ManualSwitch extends Component
-{
-       private ReadWriteEnd output;
-       private boolean isOn;
-
-       public ManualSwitch(Timeline timeline, ReadWriteEnd output)
-       {
-               super(timeline);
-               if (output.length() != 1)
-                       throw new IllegalArgumentException("Switch output can be only a single wire");
-               this.output = output;
-       }
-
-       public void switchOn()
-       {
-               setState(true);
-       }
-
-       public void switchOff()
-       {
-               setState(false);
-       }
-
-       public void toggle()
-       {
-               setState(!isOn);
-       }
-
-       public void setState(boolean isOn)
-       {
-               if (this.isOn == isOn)
-                       return;
-               this.isOn = isOn;
-               output.feedSignals(getValue());
-       }
-
-       public boolean isOn()
-       {
-               return isOn;
-       }
-
-       public Bit getValue()
-       {
-               return isOn ? Bit.ONE : Bit.ZERO;
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of();
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(output);
-       }
-
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Merger.java b/era.mi/src/net/mograsim/logic/core/components/Merger.java
deleted file mode 100644 (file)
index c4c7170..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Merger extends Component implements WireObserver
-{
-       private ReadWriteEnd out;
-       private ReadEnd[] inputs;
-       private int[] beginningIndex;
-
-       /**
-        * 
-        * @param union  The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
-        * @param inputs The inputs to be merged into the union
-        */
-       public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
-       {
-               super(timeline);
-               this.inputs = inputs;
-               this.out = union;
-               this.beginningIndex = new int[inputs.length];
-
-               int length = 0;
-               for (int i = 0; i < inputs.length; i++)
-               {
-                       beginningIndex[i] = length;
-                       length += inputs[i].length();
-                       inputs[i].addObserver(this);
-               }
-
-               if (length != union.length())
-                       throw new IllegalArgumentException(
-                                       "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
-       }
-
-       public ReadEnd getInput(int index)
-       {
-               return inputs[index];
-       }
-
-       public ReadEnd getUnion()
-       {
-               return out;
-       }
-
-       @Override
-       public void update(ReadEnd initiator, BitVector oldValues)
-       {
-               int index = find(initiator);
-               int beginning = beginningIndex[index];
-               out.feedSignals(beginning, inputs[index].getValues());
-       }
-
-       private int find(ReadEnd 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<ReadEnd> getAllInputs()
-       {
-               return List.of(inputs);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Mux.java b/era.mi/src/net/mograsim/logic/core/components/Mux.java
deleted file mode 100644 (file)
index bbb10f5..0000000
+++ /dev/null
@@ -1,95 +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.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
- * output.
- * 
- * @author Fabian Stemmler
- *
- */
-public class Mux extends BasicComponent
-{
-       private ReadEnd select;
-       private ReadWriteEnd out;
-       private ReadEnd[] inputs;
-       private final int outputSize;
-
-       /**
-        * Input {@link Wire}s and out must be of uniform length
-        * 
-        * @param out    Must be of uniform length 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 Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
-       {
-               super(timeline, processTime);
-               outputSize = out.length();
-
-               this.inputs = inputs.clone();
-               for (int i = 0; i < this.inputs.length; i++)
-               {
-                       if (inputs[i].length() != outputSize)
-                               throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");
-                       inputs[i].addObserver(this);
-               }
-
-               this.select = select;
-               select.addObserver(this);
-
-               int maxInputs = 1 << select.length();
-               if (this.inputs.length > maxInputs)
-                       throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "
-                                       + select.length() + " select bits (" + maxInputs + ").");
-
-               this.out = out;
-       }
-
-       public ReadEnd getOut()
-       {
-               return out;
-       }
-
-       public ReadEnd getSelect()
-       {
-               return select;
-       }
-
-       @Override
-       public void compute()
-       {
-               int selectValue;
-               if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
-               {
-                       out.clearSignals();
-                       return;
-               }
-
-               ReadEnd active = inputs[selectValue];
-               out.feedSignals(active.getValues());
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));
-               wires.add(select);
-               return Collections.unmodifiableList(wires);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/Splitter.java b/era.mi/src/net/mograsim/logic/core/components/Splitter.java
deleted file mode 100644 (file)
index 9eb5b2c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Splitter extends Component implements WireObserver
-{
-       private ReadEnd input;
-       private ReadWriteEnd[] outputs;
-
-       public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
-       {
-               super(timeline);
-               this.input = input;
-               this.outputs = outputs;
-               input.addObserver(this);
-               int length = 0;
-               for (ReadEnd out : outputs)
-                       length += out.length();
-
-               if (input.length() != length)
-                       throw new IllegalArgumentException(
-                                       "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");
-       }
-
-       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].length()));
-                       startIndex += outputs[i].length();
-               }
-       }
-
-       @Override
-       public void update(ReadEnd initiator, BitVector oldValues)
-       {
-               compute();
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(input);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(outputs);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/TriStateBuffer.java b/era.mi/src/net/mograsim/logic/core/components/TriStateBuffer.java
deleted file mode 100644 (file)
index f4f1b49..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class TriStateBuffer extends BasicComponent
-{
-       ReadEnd in, enable;
-       ReadWriteEnd out;
-
-       public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
-       {
-               super(timeline, processTime);
-               if (in.length() != out.length())
-                       throw new IllegalArgumentException(
-                                       "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());
-               if (enable.length() != 1)
-                       throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");
-               this.in = in;
-               in.addObserver(this);
-               this.enable = enable;
-               enable.addObserver(this);
-               this.out = out;
-       }
-
-       @Override
-       protected void compute()
-       {
-               if (enable.getValue() == Bit.ONE)
-                       out.feedSignals(in.getValues());
-               else
-                       out.clearSignals();
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(in, enable);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/gates/AndGate.java b/era.mi/src/net/mograsim/logic/core/components/gates/AndGate.java
deleted file mode 100644 (file)
index fa1e94b..0000000
+++ /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.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class AndGate extends MultiInputGate
-{
-       public AndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
-       {
-               super(timeline, processTime, BitVectorMutator::and, out, in);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/gates/MultiInputGate.java b/era.mi/src/net/mograsim/logic/core/components/gates/MultiInputGate.java
deleted file mode 100644 (file)
index afc8951..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-package net.mograsim.logic.core.components.gates;
-
-import java.util.List;
-
-import net.mograsim.logic.core.components.BasicComponent;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.MutationOperation;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public abstract class MultiInputGate extends BasicComponent
-{
-       protected ReadEnd[] in;
-       protected ReadWriteEnd out;
-       protected final int length;
-       protected MutationOperation op;
-
-       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
-       {
-               super(timeline, processTime);
-               this.op = op;
-               length = out.length();
-               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.length() != length)
-                               throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");
-                       w.addObserver(this);
-               }
-               this.out = out;
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(in);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-
-       @Override
-       protected void compute()
-       {
-               BitVectorMutator mutator = BitVectorMutator.empty();
-               for (ReadEnd w : in)
-                       op.apply(mutator, w.getValues());
-               out.feedSignals(mutator.get());
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/gates/NotGate.java b/era.mi/src/net/mograsim/logic/core/components/gates/NotGate.java
deleted file mode 100644 (file)
index b1cfefe..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.mograsim.logic.core.components.gates;
-
-import java.util.List;
-
-import net.mograsim.logic.core.components.BasicComponent;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class NotGate extends BasicComponent
-{
-       private ReadEnd in;
-       private ReadWriteEnd out;
-
-       public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
-       {
-               super(timeline, processTime);
-               this.in = in;
-               in.addObserver(this);
-               this.out = out;
-       }
-
-       @Override
-       protected void compute()
-       {
-               out.feedSignals(in.getValues().not());
-       }
-
-       public ReadEnd getIn()
-       {
-               return in;
-       }
-
-       public ReadEnd getOut()
-       {
-               return out;
-       }
-
-       @Override
-       public List<ReadEnd> getAllInputs()
-       {
-               return List.of(in);
-       }
-
-       @Override
-       public List<ReadWriteEnd> getAllOutputs()
-       {
-               return List.of(out);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/gates/OrGate.java b/era.mi/src/net/mograsim/logic/core/components/gates/OrGate.java
deleted file mode 100644 (file)
index 0072d50..0000000
+++ /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.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class OrGate extends MultiInputGate
-{
-       public OrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
-       {
-               super(timeline, processTime, BitVectorMutator::or, out, in);
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/components/gates/XorGate.java b/era.mi/src/net/mograsim/logic/core/components/gates/XorGate.java
deleted file mode 100644 (file)
index 15c24e2..0000000
+++ /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.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Outputs 1 when the number of 1 inputs is odd.
- * 
- * @author Fabian Stemmler
- */
-public class XorGate extends MultiInputGate
-{
-       public XorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
-       {
-               super(timeline, processTime, BitVectorMutator::xor, out, in);
-       }
-
-}
diff --git a/era.mi/src/net/mograsim/logic/core/tests/ComponentTest.java b/era.mi/src/net/mograsim/logic/core/tests/ComponentTest.java
deleted file mode 100644 (file)
index a47f792..0000000
+++ /dev/null
@@ -1,433 +0,0 @@
-package net.mograsim.logic.core.tests;
-
-import static org.junit.Assert.assertTrue;
-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 java.util.function.LongConsumer;
-
-import org.junit.jupiter.api.Test;
-
-import net.mograsim.logic.core.components.Connector;
-import net.mograsim.logic.core.components.Demux;
-import net.mograsim.logic.core.components.Merger;
-import net.mograsim.logic.core.components.Mux;
-import net.mograsim.logic.core.components.Splitter;
-import net.mograsim.logic.core.components.TriStateBuffer;
-import net.mograsim.logic.core.components.gates.AndGate;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.components.gates.XorGate;
-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.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-class ComponentTest
-{
-       private Timeline t = new Timeline(11);
-
-       @Test
-       void circuitExampleTest()
-       {
-               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
-                               f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
-                               k = new Wire(t, 1, 1);
-               new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
-               new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
-               new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
-               new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
-               new Splitter(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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
-               in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-               new Splitter(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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(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 Merger(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 triStateBufferTest()
-       {
-               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
-               new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
-               new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
-               new TriStateBuffer(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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(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 Mux(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.ZERO, Bit.ONE);
-               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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(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 Demux(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.ZERO, 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.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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
-               new AndGate(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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
-               new OrGate(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 xorTest()
-       {
-               t.reset();
-               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
-               new XorGate(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()
-       {
-               t.reset();
-               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
-               new NotGate(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()
-       {
-               t.reset();
-               Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
-                               nq = new Wire(t, 1, 1);
-
-               new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-               new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-               new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-               new NotGate(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()
-       {
-               t.reset();
-
-               Wire a = new Wire(t, 4, 1);
-               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
-
-               t.executeAll();
-
-               assertEquals(15, a.getUnsignedValue());
-               assertEquals(-1, a.getSignedValue());
-       }
-
-       boolean flag = false;
-
-       @Test
-       void simpleTimelineTest()
-       {
-               Timeline t = new Timeline(3);
-               flag = false;
-               t.addEvent((e) ->
-               {
-                       if (!flag)
-                               fail();
-                       flag = false;
-               }, 15);
-               t.addEvent((e) ->
-               {
-                       if (flag)
-                               fail();
-                       flag = true;
-               }, 10);
-               t.addEvent((e) ->
-               {
-                       if (flag)
-                               fail();
-                       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();
-       }
-
-       @Test
-       void multipleInputs()
-       {
-               t.reset();
-               Wire w = new Wire(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.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));
-               t.executeAll();
-               rE.close();
-               wI1.feedSignals(Bit.X, Bit.X);
-               t.executeAll();
-               wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));
-               wI1.close();
-               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-       }
-
-       @Test
-       void wireConnections()
-       {
-               // Nur ein Experiment, was Ã¼ber mehrere 'passive' Bausteine hinweg passieren würde
-
-               t.reset();
-
-               Wire a = new Wire(t, 1, 2);
-               Wire b = new Wire(t, 1, 2);
-               Wire c = new Wire(t, 1, 2);
-               ReadWriteEnd aI = a.createReadWriteEnd();
-               ReadWriteEnd bI = b.createReadWriteEnd();
-               ReadWriteEnd cI = c.createReadWriteEnd();
-
-               TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
-               TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
-               LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);
-
-               cI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-
-               cI.feedSignals(Bit.X);
-               test.assertAfterSimulationIs(print, Bit.X);
-
-               cI.feedSignals(Bit.X);
-               cI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-
-               new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
-               test.assertAfterSimulationIs(print, Bit.Z);
-               System.err.println("ONE");
-               bI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               System.err.println("ZERO");
-               bI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.ZERO);
-               System.err.println("Z");
-               bI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-
-               new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
-               System.err.println("Z 2");
-               aI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               test2.assertAfterSimulationIs(Bit.Z);
-               System.err.println("ONE 2");
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               System.err.println("ZERO 2");
-               aI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.ZERO);
-               test2.assertAfterSimulationIs(Bit.ZERO);
-               System.err.println("Z 2 II");
-               aI.feedSignals(Bit.Z);
-               test.assertAfterSimulationIs(print, Bit.Z);
-               test2.assertAfterSimulationIs(Bit.Z);
-
-               System.err.println("No Conflict yet");
-               bI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-               System.err.println("Conflict");
-               aI.feedSignals(Bit.ZERO);
-               test.assertAfterSimulationIs(print, Bit.X);
-               test2.assertAfterSimulationIs(Bit.X);
-               aI.feedSignals(Bit.ONE);
-               test.assertAfterSimulationIs(print, Bit.ONE);
-               test2.assertAfterSimulationIs(Bit.ONE);
-       }
-
-       private static void assertBitArrayEquals(BitVector actual, Bit... expected)
-       {
-               assertArrayEquals(expected, actual.getBits());
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/tests/GUITest.java b/era.mi/src/net/mograsim/logic/core/tests/GUITest.java
deleted file mode 100644 (file)
index 7d06621..0000000
+++ /dev/null
@@ -1,301 +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.ManualSwitch;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
-import net.mograsim.logic.core.wires.Wire;
-
-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);
-
-       Wire r = new Wire(t, 1, WIRE_DELAY);
-       Wire s = new Wire(t, 1, WIRE_DELAY);
-       Wire t1 = new Wire(t, 1, WIRE_DELAY);
-       Wire t2 = new Wire(t, 1, WIRE_DELAY);
-       Wire q = new Wire(t, 1, WIRE_DELAY);
-       Wire nq = new Wire(t, 1, WIRE_DELAY);
-
-       ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
-       ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
-
-       OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
-       OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
-       NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
-       NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
-
-       Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
-
-       int height;
-       int width;
-       boolean sizeChanged;
-
-       public GUITest()
-       {
-               addMouseListener(new MouseListener()
-               {
-
-                       @Override
-                       public void mouseReleased(MouseEvent e)
-                       {
-                               for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
-                               {
-                                       if (dim.getValue().contains(e.getPoint()))
-                                       {
-                                               dim.getKey().switchOff();
-                                               repaint();
-                                       }
-                               }
-                       }
-
-                       @Override
-                       public void mousePressed(MouseEvent e)
-                       {
-                               for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
-                               {
-                                       if (dim.getValue().contains(e.getPoint()))
-                                       {
-                                               dim.getKey().switchOn();
-                                               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<ManualSwitch, Rectangle> 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));
-       }
-
-       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, Wire 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, ManualSwitch 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.isOn() ? 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, Wire 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/era.mi/src/net/mograsim/logic/core/tests/TestBitDisplay.java b/era.mi/src/net/mograsim/logic/core/tests/TestBitDisplay.java
deleted file mode 100644 (file)
index 015e257..0000000
+++ /dev/null
@@ -1,47 +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.BitDisplay;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public final class TestBitDisplay extends BitDisplay
-{
-
-       public TestBitDisplay(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 void compute()
-       {
-               super.compute();
-               System.out.println("update: value is " + getDisplayedValue());
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/timeline/Timeline.java b/era.mi/src/net/mograsim/logic/core/timeline/Timeline.java
deleted file mode 100644 (file)
index fb639be..0000000
+++ /dev/null
@@ -1,203 +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<InnerEvent> events;
-       private LongSupplier time;
-       private long lastTimeUpdated = 0;
-
-       private final List<Consumer<TimelineEvent>> eventAddedListener;
-
-       public Timeline(int initCapacity)
-       {
-               events = new PriorityQueue<InnerEvent>(initCapacity);
-
-               eventAddedListener = new ArrayList<>();
-               time = () -> lastTimeUpdated;
-       }
-
-       /**
-        * @param timestamp exclusive
-        * @return true if the first event is later than the timestamp
-        */
-       public BooleanSupplier laterThan(long timestamp)
-       {
-               return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;
-       }
-
-       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);
-       }
-
-       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
-        * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty
-        * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached
-        * <code>EXEC_UNTIL_CONDITION</code> if the condition was met
-        * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty
-        * @formatter:on
-        * @author Christian Femers, Fabian Stemmler
-        */
-       public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)
-       {
-               if (events.isEmpty())
-               {
-                       lastTimeUpdated = getSimulationTime();
-                       return ExecutionResult.NOTHING_DONE;
-               }
-               int checkStop = 0;
-               InnerEvent first = events.peek();
-               while (hasNext() && !condition.getAsBoolean())
-               {
-                       events.remove();
-                       lastTimeUpdated = first.getTiming();
-                       first.run();
-                       // Don't check after every run
-                       checkStop = (checkStop + 1) % 10;
-                       if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
-                               return ExecutionResult.EXEC_OUT_OF_TIME;
-                       first = events.peek();
-               }
-               lastTimeUpdated = getSimulationTime();
-               return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;
-       }
-
-       public void setTimeFunction(LongSupplier time)
-       {
-               this.time = time;
-       }
-
-       public long getSimulationTime()
-       {
-               return time.getAsLong();
-       }
-
-       public long nextEventTime()
-       {
-               if (!hasNext())
-                       return -1;
-               return events.peek().getTiming();
-       }
-
-       public void reset()
-       {
-               events.clear();
-               lastTimeUpdated = 0;
-       }
-
-       public void addEventAddedListener(Consumer<TimelineEvent> listener)
-       {
-               eventAddedListener.add(listener);
-       }
-
-       public void removeEventAddedListener(Consumer<TimelineEvent> 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);
-               events.add(new InnerEvent(function, event));
-               eventAddedListener.forEach(l -> l.accept(event));
-       }
-
-       private class InnerEvent implements Runnable, Comparable<InnerEvent>
-       {
-               private final TimelineEventHandler function;
-               private final TimelineEvent event;
-
-               /**
-                * 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)
-               {
-                       this.function = function;
-                       this.event = event;
-               }
-
-               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)
-               {
-                       return timeCmp(getTiming(), o.getTiming());
-               }
-       }
-
-       public static int timeCmp(long a, long b)
-       {
-               return Long.signum(a - b);
-       }
-
-       @Override
-       public String toString()
-       {
-               return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());
-       }
-
-       public enum ExecutionResult
-       {
-               NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/net/mograsim/logic/core/timeline/TimelineEvent.java b/era.mi/src/net/mograsim/logic/core/timeline/TimelineEvent.java
deleted file mode 100644 (file)
index c46e6ad..0000000
+++ /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/era.mi/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java b/era.mi/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java
deleted file mode 100644 (file)
index badbabc..0000000
+++ /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/era.mi/src/net/mograsim/logic/core/types/Bit.java b/era.mi/src/net/mograsim/logic/core/types/Bit.java
deleted file mode 100644 (file)
index fbfd0d5..0000000
+++ /dev/null
@@ -1,132 +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<Bit>
-{
-       U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z");
-
-       private final String symbol;
-
-       private Bit(String symbol)
-       {
-               this.symbol = symbol;
-       }
-
-       @Override
-       public Bit and(Bit other)
-       {
-               return fromTable(AND_TABLE, this, other);
-       }
-
-       @Override
-       public Bit or(Bit other)
-       {
-               return fromTable(OR_TABLE, this, other);
-       }
-
-       @Override
-       public Bit xor(Bit other)
-       {
-               return fromTable(XOR_TABLE, this, other);
-       }
-
-       @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(int length)
-       {
-               return BitVector.of(this, length);
-       }
-
-       @Override
-       public Bit join(Bit other)
-       {
-               return fromTable(JOIN_TABLE, this, other);
-       }
-
-       @Override
-       public String toString()
-       {
-               return getSymbol();
-       }
-
-       public String getSymbol()
-       {
-               return symbol;
-       }
-
-       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<String, Bit> 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/era.mi/src/net/mograsim/logic/core/types/BitVector.java b/era.mi/src/net/mograsim/logic/core/types/BitVector.java
deleted file mode 100644 (file)
index 1e87f9a..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-package net.mograsim.logic.core.types;
-
-import static java.lang.String.format;
-
-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<BitVector>, Iterable<Bit>, RandomAccess
-{
-       private final Bit[] bits;
-
-       private BitVector(Bit[] bits)
-       {
-               this.bits = Objects.requireNonNull(bits);
-       }
-
-       public static BitVector of(Bit... bits)
-       {
-               return new BitVector(bits.clone());
-       }
-
-       public static BitVector of(Bit bit, int length)
-       {
-               return new BitVector(bit.makeArray(length));
-       }
-
-       public BitVectorMutator mutator()
-       {
-               return BitVectorMutator.of(this);
-       }
-
-       public Bit getBit(int bitIndex)
-       {
-               return bits[bitIndex];
-       }
-
-       public Bit[] getBits()
-       {
-               return bits.clone();
-       }
-
-       @Override
-       public BitVector join(BitVector t)
-       {
-               checkCompatibility(t);
-               return new BitVector(binOp(bits.clone(), t.bits, Bit::join));
-       }
-
-       @Override
-       public BitVector and(BitVector t)
-       {
-               checkCompatibility(t);
-               return new BitVector(binOp(bits.clone(), t.bits, Bit::and));
-       }
-
-       @Override
-       public BitVector or(BitVector t)
-       {
-               checkCompatibility(t);
-               return new BitVector(binOp(bits.clone(), t.bits, Bit::or));
-       }
-
-       @Override
-       public BitVector xor(BitVector t)
-       {
-               checkCompatibility(t);
-               return new BitVector(binOp(bits.clone(), t.bits, Bit::xor));
-       }
-
-       @Override
-       public BitVector not()
-       {
-               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<Bit> 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<Bit> 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
-        */
-       @SuppressWarnings("synthetic-access")
-       public static final class BitVectorMutator implements LogicType<BitVectorMutator, BitVector>
-       {
-               private Bit[] bits;
-
-               private BitVectorMutator(Bit[] bits)
-               {
-                       this.bits = bits;
-               }
-
-               static BitVectorMutator of(BitVector bv)
-               {
-                       return new BitVectorMutator(bv.getBits());
-               }
-
-               /**
-                * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed.
-                * 
-                */
-               public static BitVectorMutator empty()
-               {
-                       return new BitVectorMutator(null);
-               }
-
-               /**
-                * Produces the resulting, immutable {@link BitVector}<br>
-                * 
-                * @throws IllegalStateException if the mutator is (still) empty
-                */
-               public BitVector get()
-               {
-                       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;
-               }
-
-               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 <code>offset</code> to the right.<br>
-        * Therefore <code>offset + other.length() <= this.length()</code> needs to be true.
-        * 
-        * @throws ArrayIndexOutOfBoundsException if <code>offset + other.length() > this.length()</code>
-        * 
-        * @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
-        * 
-        * @see #parse(String)
-        */
-       @Override
-       public String toString()
-       {
-               StringBuilder sb = new StringBuilder(bits.length);
-               for (Bit bit : bits)
-                       sb.append(bit);
-               return sb.toString();
-       }
-
-       /**
-        * Parses a String containing solely {@link Bit} symbols
-        * 
-        * @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);
-       }
-
-       @Override
-       public Iterator<Bit> iterator()
-       {
-               return new Iterator<>()
-               {
-                       private int pos = 0;
-
-                       @Override
-                       public Bit next()
-                       {
-                               if (!hasNext())
-                                       throw new NoSuchElementException();
-                               return getBit(pos++);
-                       }
-
-                       @Override
-                       public boolean hasNext()
-                       {
-                               return pos != length();
-                       }
-               };
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/era.mi/src/net/mograsim/logic/core/types/BitVectorFormatter.java
deleted file mode 100644 (file)
index a798531..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-package net.mograsim.logic.core.types;
-
-import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-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";
-               else
-                       return bitVector.toString();
-       }
-
-       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);
-               else
-                       switch (bitVector.getBit(0))
-                       {
-                       case ONE:
-                               return new ColorDefinition(BuiltInColor.COLOR_GREEN);
-                       case U:
-                               return new ColorDefinition(BuiltInColor.COLOR_CYAN);
-                       case X:
-                               return new ColorDefinition(BuiltInColor.COLOR_RED);
-                       case Z:
-                               return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
-                       case ZERO:
-                               return new ColorDefinition(BuiltInColor.COLOR_GRAY);
-                       default:
-                               throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(0));
-                       }
-       }
-
-       private BitVectorFormatter()
-       {
-               throw new UnsupportedOperationException("No BitVectorFormatter instances");
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/net/mograsim/logic/core/types/ColorDefinition.java b/era.mi/src/net/mograsim/logic/core/types/ColorDefinition.java
deleted file mode 100644 (file)
index 2801736..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-package net.mograsim.logic.core.types;
-
-/**
- * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT).
- * <p>
- * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case <code>r==g==b==-1</code>, or by red / green
- * / blue components, in which case <code>builtInColor==null</code>
- */
-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;
-       }
-
-       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/era.mi/src/net/mograsim/logic/core/types/LogicType.java b/era.mi/src/net/mograsim/logic/core/types/LogicType.java
deleted file mode 100644 (file)
index 39ae681..0000000
+++ /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 <T> the logic type itself, to make the operations closed in T
- * @param <S> the operand type, may be the same as T, see {@link StrictLogicType}
- */
-public interface LogicType<T extends LogicType<T, S>, S>
-{
-       /**
-        * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164)
-        * 
-        * For example:
-        * 
-        * <pre>
-        * 0 joined 0 == 0
-        * 1 joined 0 == X
-        * 0 joined 1 == X
-        * 1 joined 1 == 1
-        * </pre>
-        * 
-        * @param t the second logic signal
-        * @return the resulting value
-        * @author Christian Femers
-        */
-       T join(S t);
-
-       /**
-        * Classical logic AND
-        * 
-        * For example:
-        * 
-        * <pre>
-        * 0 AND 0 == 0
-        * 1 AND 0 == 0
-        * 0 AND 1 == 0
-        * 1 AND 1 == 1
-        * </pre>
-        * 
-        * @param t the second logic signal
-        * @return the resulting value
-        * @author Christian Femers
-        */
-       T and(S t);
-
-       /**
-        * Classical logic OR
-        *
-        * For example:
-        * 
-        * <pre>
-        * 0 OR 0 == 0
-        * 1 OR 0 == 1
-        * 0 OR 1 == 1
-        * 1 OR 1 == 1
-        * </pre>
-        * 
-        * @param t the second logic signal
-        * @return the resulting value
-        * @author Christian Femers
-        */
-       T or(S t);
-
-       /**
-        * Classical logic XOR (exclusive OR)
-        * 
-        * For example:
-        * 
-        * <pre>
-        * 0 XOR 0 == 0
-        * 1 XOR 0 == 1
-        * 0 XOR 1 == 1
-        * 1 XOR 1 == 0
-        * </pre>
-        * 
-        * @param t the second logic signal
-        * @return the resulting value
-        * @author Christian Femers
-        */
-       T xor(S t);
-
-       /**
-        * Classical logic NOT (logical negation)
-        * 
-        * For example:
-        * 
-        * <pre>
-        * NOT 0 == 1
-        * NOT 1 == 0
-        * </pre>
-        * 
-        * @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}<br>
-        * Used to determine equality (alias parity, consistency)
-        * 
-        * @author Christian Femers
-        */
-       default T xnor(S t)
-       {
-               return xor(t).not();
-       }
-}
diff --git a/era.mi/src/net/mograsim/logic/core/types/MutationOperation.java b/era.mi/src/net/mograsim/logic/core/types/MutationOperation.java
deleted file mode 100644 (file)
index 1fdae21..0000000
+++ /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<BitVectorMutator, BitVector, BitVectorMutator>
-{
-       // no changes necessary, only for convenience and readability
-}
diff --git a/era.mi/src/net/mograsim/logic/core/types/StrictLogicType.java b/era.mi/src/net/mograsim/logic/core/types/StrictLogicType.java
deleted file mode 100644 (file)
index c830b58..0000000
+++ /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 <T> the logic type itself to make the operations closed
- */
-public interface StrictLogicType<T extends StrictLogicType<T>> extends LogicType<T, T>
-{
-       // this is just a matter of type parameters
-}
diff --git a/era.mi/src/net/mograsim/logic/core/wires/Wire.java b/era.mi/src/net/mograsim/logic/core/wires/Wire.java
deleted file mode 100644 (file)
index d73ee61..0000000
+++ /dev/null
@@ -1,492 +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.List;
-
-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 Wire
-{
-       private BitVector values;
-       public final int travelTime;
-       private List<ReadEnd> attached = new ArrayList<ReadEnd>();
-       public final int length;
-       private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();
-       private Timeline timeline;
-
-       public Wire(Timeline timeline, int length, int travelTime)
-       {
-               if (length < 1)
-                       throw new IllegalArgumentException(
-                                       String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
-               this.timeline = timeline;
-               this.length = length;
-               this.travelTime = travelTime;
-               initValues();
-       }
-
-       private void initValues()
-       {
-               values = U.toVector(length);
-       }
-
-       private void recalculateSingleInput()
-       {
-               setNewValues(inputs.get(0).getInputValues());
-       }
-
-       private void recalculateMultipleInputs()
-       {
-               BitVectorMutator mutator = BitVectorMutator.empty();
-               for (ReadWriteEnd wireArrayEnd : inputs)
-                       mutator.join(wireArrayEnd.getInputValues());
-               setNewValues(mutator.get());
-       }
-
-       private void setNewValues(BitVector newValues)
-       {
-               if (values.equals(newValues))
-                       return;
-               BitVector oldValues = values;
-               values = newValues;
-               notifyObservers(oldValues);
-       }
-
-       private void recalculate()
-       {
-               switch (inputs.size())
-               {
-               case 0:
-                       return;
-               case 1:
-                       recalculateSingleInput();
-                       break;
-               default:
-                       recalculateMultipleInputs();
-               }
-       }
-
-       /**
-        * The {@link Wire} is interpreted as an unsigned integer with n bits.
-        * 
-        * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the same
-        *         value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
-        * 
-        * @author Fabian Stemmler
-        */
-       public boolean hasNumericValue()
-       {
-               for (Bit b : values)
-               {
-                       if (b != Bit.ZERO && b != Bit.ONE)
-                               return false;
-               }
-               return true;
-       }
-
-       /**
-        * The {@link Wire} is interpreted as an unsigned integer with n bits.
-        * 
-        * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
-        * 
-        * @author Fabian Stemmler
-        */
-       public long getUnsignedValue()
-       {
-               long val = 0;
-               long mask = 1;
-               for (Bit bit : values)
-               {
-                       switch (bit)
-                       {
-                       default:
-                       case Z:
-                       case X:
-                               return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;
-                       case ONE:
-                               val |= mask;
-                               break;
-                       case ZERO:
-                       }
-                       mask = mask << 1;
-               }
-               return val;
-       }
-
-       /**
-        * The {@link Wire} is interpreted as a signed integer with n bits.
-        * 
-        * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
-        * 
-        * @author Fabian Stemmler
-        */
-       public long getSignedValue()
-       {
-               long val = getUnsignedValue();
-               long mask = 1 << (length - 1);
-               if ((mask & val) != 0)
-               {
-                       int shifts = 64 - length;
-                       return (val << shifts) >> shifts;
-               }
-               return val;
-       }
-
-       public Bit getValue()
-       {
-               return getValue(0);
-       }
-
-       public Bit getValue(int index)
-       {
-               return values.getBit(index);
-       }
-
-       public BitVector getValues(int start, int end)
-       {
-               return values.subVector(start, end);
-       }
-
-       public BitVector getValues()
-       {
-               return values;
-       }
-
-       /**
-        * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated.
-        * 
-        * @param ob The {@link WireObserver} to be notified of changes.
-        * @return true if the given {@link WireObserver} was not already registered, false otherwise
-        * 
-        * @author Fabian Stemmler
-        */
-       private void attachEnd(ReadEnd end)
-       {
-               attached.add(end);
-       }
-
-       private void detachEnd(ReadEnd end)
-       {
-               attached.remove(end);
-       }
-
-       private void notifyObservers(BitVector oldValues)
-       {
-               for (ReadEnd o : attached)
-                       o.update(oldValues);
-       }
-
-       /**
-        * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link Wire}. This {@link ReadWriteEnd} can be written to.
-        */
-       public ReadWriteEnd createReadWriteEnd()
-       {
-               return new ReadWriteEnd();
-       }
-
-       /**
-        * Create a {@link ReadEnd} object, which is tied to this {@link Wire}. This {@link ReadEnd} cannot be written to.
-        */
-       public ReadEnd createReadOnlyEnd()
-       {
-               return new ReadEnd();
-       }
-
-       private void registerInput(ReadWriteEnd toRegister)
-       {
-               inputs.add(toRegister);
-       }
-
-       /**
-        * A {@link ReadEnd} feeds a constant signal into the {@link Wire} it is tied to. The combination of all inputs determines the
-        * {@link Wire}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
-       {
-               private List<WireObserver> observers = new ArrayList<WireObserver>();
-
-               private ReadEnd()
-               {
-                       super();
-                       Wire.this.attachEnd(this);
-               }
-
-               public void update(BitVector oldValues)
-               {
-                       for (WireObserver ob : observers)
-                               ob.update(this, oldValues);
-               }
-
-               /**
-                * Included for convenient use on {@link Wire}s of length 1.
-                * 
-                * @return The value of bit 0.
-                * 
-                * @author Fabian Stemmler
-                */
-               public Bit getValue()
-               {
-                       return Wire.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 Wire.this.getValue(index);
-               }
-
-               /**
-                * @param index Index of the requested bit.
-                * @return The value of the indexed bit.
-                * 
-                * @author Fabian Stemmler
-                */
-               public BitVector getValues()
-               {
-                       return Wire.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 Wire.this.getValues(start, end);
-               }
-
-               /**
-                * The {@link Wire} is interpreted as an unsigned integer with n bits.
-                * 
-                * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the
-                *         same value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
-                * 
-                * @author Fabian Stemmler
-                */
-               public boolean hasNumericValue()
-               {
-                       return Wire.this.hasNumericValue();
-               }
-
-               /**
-                * The {@link Wire} is interpreted as an unsigned integer with n bits.
-                * 
-                * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
-                * 
-                * @author Fabian Stemmler
-                */
-               public long getUnsignedValue()
-               {
-                       return Wire.this.getUnsignedValue();
-               }
-
-               /**
-                * The {@link Wire} is interpreted as a signed integer with n bits.
-                * 
-                * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
-                * 
-                * @author Fabian Stemmler
-                */
-               public long getSignedValue()
-               {
-                       return Wire.this.getSignedValue();
-               }
-
-               @Override
-               public String toString()
-               {
-                       return Wire.this.toString();
-               }
-
-               public void close()
-               {
-                       inputs.remove(this);
-                       detachEnd(this);
-                       recalculate();
-               }
-
-               public int length()
-               {
-                       return length;
-               }
-
-               public boolean addObserver(WireObserver ob)
-               {
-                       return observers.add(ob);
-               }
-
-               public Wire getWire()
-               {
-                       return Wire.this;
-               }
-       }
-
-       public class ReadWriteEnd extends ReadEnd
-       {
-               private boolean open;
-               private BitVector inputValues;
-
-               private ReadWriteEnd()
-               {
-                       super();
-                       open = true;
-                       initValues();
-                       registerInput(this);
-               }
-
-               private void initValues()
-               {
-                       inputValues = U.toVector(length);
-               }
-
-               /**
-                * Sets the wires values. This takes up time, as specified by the {@link Wire}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));
-               }
-
-               public void feedSignals(BitVector newValues)
-               {
-                       if (newValues.length() != length)
-                               throw new IllegalArgumentException(
-                                               String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));
-                       if (!open)
-                               throw new RuntimeException("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 Wire}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 RuntimeException("Attempted to write to closed WireArrayEnd.");
-                       timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);
-               }
-
-               private 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);
-                               Wire.this.recalculate();
-                       }
-               }
-
-               private void setValues(BitVector newValues)
-               {
-                       if (inputValues.equals(newValues))
-                               return;
-                       inputValues = newValues;
-                       Wire.this.recalculate();
-               }
-
-               /**
-                * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
-                */
-               public Bit getInputValue()
-               {
-                       return getInputValue(0);
-               }
-
-               /**
-                * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link Wire} at the indexed {@link Bit}.
-                */
-               public Bit getInputValue(int index)
-               {
-                       return inputValues.getBit(index);
-               }
-
-               /**
-                * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
-                */
-               public BitVector getInputValues()
-               {
-                       return getInputValues(0, length);
-               }
-
-               public BitVector getInputValues(int start, int end)
-               {
-                       return inputValues.subVector(start, end);
-               }
-
-               /**
-                * {@link ReadEnd} now feeds Z into the associated {@link Wire}.
-                */
-               public void clearSignals()
-               {
-                       feedSignals(Z.toVector(length));
-               }
-
-               public BitVector wireValuesExcludingMe()
-               {
-                       BitVectorMutator mutator = BitVectorMutator.empty();
-                       for (ReadWriteEnd wireEnd : inputs)
-                       {
-                               if (wireEnd == this)
-                                       continue;
-                               mutator.join(wireEnd.inputValues);
-                       }
-                       return mutator.get();
-               }
-
-               @Override
-               public String toString()
-               {
-                       return inputValues.toString();
-               }
-       }
-
-       @Override
-       public String toString()
-       {
-               return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs);
-               // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)
-       }
-
-       public static ReadEnd[] extractEnds(Wire[] w)
-       {
-               ReadEnd[] inputs = new ReadEnd[w.length];
-               for (int i = 0; i < w.length; i++)
-                       inputs[i] = w[i].createReadWriteEnd();
-               return inputs;
-       }
-}
\ No newline at end of file
diff --git a/era.mi/src/net/mograsim/logic/core/wires/WireObserver.java b/era.mi/src/net/mograsim/logic/core/wires/WireObserver.java
deleted file mode 100644 (file)
index 66914b4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package net.mograsim.logic.core.wires;
-
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public interface WireObserver
-{
-       public void update(ReadEnd initiator, BitVector oldValues);
-}
diff --git a/net.mograsim.logic.core/.classpath b/net.mograsim.logic.core/.classpath
new file mode 100644 (file)
index 0000000..dd2ee31
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
+               <attributes>
+                       <attribute name="module" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/net.mograsim.logic.core/.gitignore b/net.mograsim.logic.core/.gitignore
new file mode 100644 (file)
index 0000000..f59a3a7
--- /dev/null
@@ -0,0 +1,15 @@
+/bin/
+*.class
+*.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
new file mode 100644 (file)
index 0000000..783f7c7
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>net.mograsim.logic.core</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..020d558
--- /dev/null
@@ -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=10
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=10
+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=10
+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
new file mode 100644 (file)
index 0000000..9465882
--- /dev/null
@@ -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/net.mograsim.logic.core/META-INF/MANIFEST.MF b/net.mograsim.logic.core/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..655b575
--- /dev/null
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: net.mograsim.logic.core
+Bundle-SymbolicName: net.mograsim.logic.core
+Bundle-Version: 1.0.0.qualifier
+Export-Package: net.mograsim.logic.core,
+ net.mograsim.logic.core.components,
+ net.mograsim.logic.core.components.gates,
+ net.mograsim.logic.core.tests,
+ net.mograsim.logic.core.timeline,
+ net.mograsim.logic.core.types,
+ net.mograsim.logic.core.wires
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+Automatic-Module-Name: net.mograsim.logic.core
diff --git a/net.mograsim.logic.core/build.properties b/net.mograsim.logic.core/build.properties
new file mode 100644 (file)
index 0000000..b107977
--- /dev/null
@@ -0,0 +1,3 @@
+source.. = src/
+bin.includes = META-INF/,\
+               .
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/Util.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/Util.java
new file mode 100644 (file)
index 0000000..dd3671c
--- /dev/null
@@ -0,0 +1,110 @@
+package net.mograsim.logic.core;
+
+import java.util.Arrays;
+
+import net.mograsim.logic.core.types.Bit;
+
+public final class Util
+{
+
+       @SuppressWarnings("unchecked")
+       public static <T> T[] concat(T[]... arrays)
+       {
+               if (arrays.length == 0)
+                       throw new IllegalArgumentException("Cannot concatenate 0 arrays.");
+
+               int length = 0;
+               for (T[] array : arrays)
+                       length += array.length;
+
+               T[] newArray = Arrays.copyOf(arrays[0], length);
+               int appendIndex = arrays[0].length;
+               for (int i = 1; i < arrays.length; i++)
+               {
+                       System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);
+                       appendIndex += arrays[i].length;
+               }
+
+               return newArray;
+       }
+
+//     @SuppressWarnings("unchecked")
+//     public static <T> T[][] split(T[] array, int... lengths)
+//     {
+//             //TODO: implement array split again; This version contains an illegal cast
+//             int totalLength = 0;
+//             for(int length : lengths)
+//                     totalLength += length;
+//             
+//             if(totalLength != array.length)
+//                     throw new IllegalArgumentException(); //TODO: add proper error message
+//             
+//             Object[][] newArray = new Object[lengths.length][];
+//             int splitIndex = 0;
+//             for(int i = 0; i < lengths.length; i++)
+//             {
+//                     System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);
+//                     splitIndex += lengths[i];
+//             }
+//             
+//             return (T[][]) newArray;
+//     }
+
+       public static Bit[] and(Bit[] a, Bit[] b)
+       {
+               return binBitOp(a, b, Bit::and);
+       }
+
+       public static Bit[] or(Bit[] a, Bit[] b)
+       {
+               return binBitOp(a, b, Bit::or);
+       }
+
+       public static Bit[] xor(Bit[] a, Bit[] b)
+       {
+               return binBitOp(a, b, Bit::xor);
+       }
+
+       private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)
+       {
+               if (a.length != b.length)
+                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");
+               Bit[] out = new Bit[a.length];
+               for (int i = 0; i < a.length; i++)
+               {
+                       out[i] = op.execute(a[i], b[i]);
+               }
+               return out;
+       }
+
+       public static Bit[] not(Bit[] a)
+       {
+               Bit[] out = new Bit[a.length];
+               for (int i = 0; i < a.length; i++)
+               {
+                       out[i] = a[i].not();
+               }
+               return out;
+       }
+
+       /**
+        * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array.
+        * 
+        * @author Christian Femers
+        */
+       public static Bit[] combineInto(Bit[] dest, Bit[] addition)
+       {
+               if (dest.length != addition.length)
+                       throw new IllegalArgumentException("Bit Arrays were not of equal length.");
+               for (int i = 0; i < addition.length; i++)
+               {
+                       dest[i] = dest[i].join(addition[i]);
+               }
+               return dest;
+       }
+
+       interface BitOp
+       {
+               Bit execute(Bit a, Bit b);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicComponent.java
new file mode 100644 (file)
index 0000000..426c6a1
--- /dev/null
@@ -0,0 +1,36 @@
+package net.mograsim.logic.core.components;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+/**
+ * A basic component that recomputes all outputs (with a delay), when it is updated.
+ * 
+ * @author Fabian Stemmler
+ */
+public abstract class BasicComponent extends Component implements WireObserver
+{
+       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 BasicComponent(Timeline timeline, int processTime)
+       {
+               super(timeline);
+               this.processTime = processTime > 0 ? processTime : 1;
+       }
+
+       @Override
+       public void update(ReadEnd initiator, BitVector oldValues)
+       {
+               timeline.addEvent(e -> compute(), processTime);
+       }
+
+       protected abstract void compute();
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BitDisplay.java
new file mode 100644 (file)
index 0000000..268d157
--- /dev/null
@@ -0,0 +1,51 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+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.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class BitDisplay extends BasicComponent
+{
+       private final ReadEnd in;
+       private BitVector displayedValue;
+
+       public BitDisplay(Timeline timeline, ReadEnd in)
+       {
+               super(timeline, 1);
+               this.in = in;
+               in.addObserver(this);
+               compute();
+       }
+
+       @Override
+       protected void compute()
+       {
+               displayedValue = in.getValues();
+       }
+
+       public BitVector getDisplayedValue()
+       {
+               return displayedValue;
+       }
+
+       public boolean isDisplaying(Bit... values)
+       {
+               return displayedValue.equals(BitVector.of(values));
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of();
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Clock.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Clock.java
new file mode 100644 (file)
index 0000000..6562135
--- /dev/null
@@ -0,0 +1,61 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+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.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Clock extends Component implements TimelineEventHandler
+{
+       private boolean toggle = false;
+       private ReadWriteEnd out;
+       private int delta;
+
+       /**
+        * 
+        * @param out   {@link Wire} the clock's impulses are fed into
+        * @param delta ticks between rising and falling edge
+        */
+       public Clock(Timeline timeline, ReadWriteEnd out, int delta)
+       {
+               super(timeline);
+               this.delta = delta;
+               this.out = out;
+               addToTimeline();
+       }
+
+       @Override
+       public void handle(TimelineEvent e)
+       {
+               addToTimeline();
+               out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
+               toggle = !toggle;
+       }
+
+       public ReadWriteEnd getOut()
+       {
+               return out;
+       }
+
+       private void addToTimeline()
+       {
+               timeline.addEvent(this, delta);
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of();
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Component.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Component.java
new file mode 100644 (file)
index 0000000..834f4b5
--- /dev/null
@@ -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.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public abstract class Component
+{
+       protected Timeline timeline;
+
+       public Component(Timeline timeline)
+       {
+               this.timeline = timeline;
+       }
+
+       /**
+        * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization
+        * in the UI.
+        */
+       public abstract List<ReadEnd> getAllInputs();
+
+       /**
+        * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.
+        */
+       public abstract List<ReadWriteEnd> getAllOutputs();
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Connector.java
new file mode 100644 (file)
index 0000000..16b8e70
--- /dev/null
@@ -0,0 +1,76 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Connector extends Component implements WireObserver
+{
+       private boolean connected;
+       private final ReadWriteEnd a;
+       private final ReadWriteEnd b;
+
+       public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
+       {
+               super(timeline);
+               if (a.length() != b.length())
+                       throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
+               this.a = a;
+               this.b = b;
+               a.addObserver(this);
+               b.addObserver(this);
+       }
+
+       public void connect()
+       {
+               connected = true;
+               update(a);
+               update(b);
+       }
+
+       public void disconnect()
+       {
+               connected = false;
+               a.clearSignals();
+               b.clearSignals();
+       }
+
+       public void setConnection(boolean connected)
+       {
+               if (connected)
+                       connect();
+               else
+                       disconnect();
+       }
+
+       @Override
+       public void update(ReadEnd initiator, BitVector oldValues)
+       {
+               if (connected)
+                       timeline.addEvent(e -> update(initiator), 1);
+       }
+
+       private void update(ReadEnd initiator)
+       {
+               if (initiator == a)
+                       b.feedSignals(a.wireValuesExcludingMe());
+               else
+                       a.feedSignals(b.wireValuesExcludingMe());
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(a, b);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(a, b);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Demux.java
new file mode 100644 (file)
index 0000000..5da1bf6
--- /dev/null
@@ -0,0 +1,82 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
+ * output.
+ * 
+ * @author Fabian Stemmler
+ *
+ */
+public class Demux extends BasicComponent
+{
+       private final ReadEnd select, in;
+       private final ReadWriteEnd[] outputs;
+       private final int outputSize;
+       private int selected = -1;
+
+       /**
+        * Output {@link Wire}s and in must be of uniform length
+        * 
+        * @param in      Must be of uniform length 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 Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
+       {
+               super(timeline, processTime);
+               outputSize = in.length();
+
+               this.in = in;
+               this.outputs = outputs;
+               for (int i = 0; i < this.outputs.length; i++)
+               {
+                       if (outputs[i].length() != outputSize)
+                               throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");
+                       this.outputs[i] = outputs[i];
+               }
+
+               this.select = select;
+               select.addObserver(this);
+
+               int maxInputs = 1 << select.length();
+               if (this.outputs.length > maxInputs)
+                       throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by "
+                                       + select.length() + " select bits (" + maxInputs + ").");
+               in.addObserver(this);
+       }
+
+       @Override
+       public void compute()
+       {
+               int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;
+               if (selectValue >= outputs.length)
+                       selectValue = -1;
+
+               if (selected != selectValue && selected != -1)
+                       outputs[selected].clearSignals();
+
+               selected = selectValue;
+
+               if (selectValue != -1)
+                       outputs[selectValue].feedSignals(in.getValues());
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in, select);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(outputs);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/ManualSwitch.java
new file mode 100644 (file)
index 0000000..fc6e943
--- /dev/null
@@ -0,0 +1,74 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * This class models a simple on/off (ONE/ZERO) switch for user interaction.
+ *
+ * @author Christian Femers
+ *
+ */
+public class ManualSwitch extends Component
+{
+       private ReadWriteEnd output;
+       private boolean isOn;
+
+       public ManualSwitch(Timeline timeline, ReadWriteEnd output)
+       {
+               super(timeline);
+               if (output.length() != 1)
+                       throw new IllegalArgumentException("Switch output can be only a single wire");
+               this.output = output;
+       }
+
+       public void switchOn()
+       {
+               setState(true);
+       }
+
+       public void switchOff()
+       {
+               setState(false);
+       }
+
+       public void toggle()
+       {
+               setState(!isOn);
+       }
+
+       public void setState(boolean isOn)
+       {
+               if (this.isOn == isOn)
+                       return;
+               this.isOn = isOn;
+               output.feedSignals(getValue());
+       }
+
+       public boolean isOn()
+       {
+               return isOn;
+       }
+
+       public Bit getValue()
+       {
+               return isOn ? Bit.ONE : Bit.ZERO;
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of();
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(output);
+       }
+
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Merger.java
new file mode 100644 (file)
index 0000000..c4c7170
--- /dev/null
@@ -0,0 +1,85 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Merger extends Component implements WireObserver
+{
+       private ReadWriteEnd out;
+       private ReadEnd[] inputs;
+       private int[] beginningIndex;
+
+       /**
+        * 
+        * @param union  The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
+        * @param inputs The inputs to be merged into the union
+        */
+       public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
+       {
+               super(timeline);
+               this.inputs = inputs;
+               this.out = union;
+               this.beginningIndex = new int[inputs.length];
+
+               int length = 0;
+               for (int i = 0; i < inputs.length; i++)
+               {
+                       beginningIndex[i] = length;
+                       length += inputs[i].length();
+                       inputs[i].addObserver(this);
+               }
+
+               if (length != union.length())
+                       throw new IllegalArgumentException(
+                                       "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
+       }
+
+       public ReadEnd getInput(int index)
+       {
+               return inputs[index];
+       }
+
+       public ReadEnd getUnion()
+       {
+               return out;
+       }
+
+       @Override
+       public void update(ReadEnd initiator, BitVector oldValues)
+       {
+               int index = find(initiator);
+               int beginning = beginningIndex[index];
+               out.feedSignals(beginning, inputs[index].getValues());
+       }
+
+       private int find(ReadEnd 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<ReadEnd> getAllInputs()
+       {
+               return List.of(inputs);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Mux.java
new file mode 100644 (file)
index 0000000..bbb10f5
--- /dev/null
@@ -0,0 +1,95 @@
+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.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
+ * output.
+ * 
+ * @author Fabian Stemmler
+ *
+ */
+public class Mux extends BasicComponent
+{
+       private ReadEnd select;
+       private ReadWriteEnd out;
+       private ReadEnd[] inputs;
+       private final int outputSize;
+
+       /**
+        * Input {@link Wire}s and out must be of uniform length
+        * 
+        * @param out    Must be of uniform length 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 Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+       {
+               super(timeline, processTime);
+               outputSize = out.length();
+
+               this.inputs = inputs.clone();
+               for (int i = 0; i < this.inputs.length; i++)
+               {
+                       if (inputs[i].length() != outputSize)
+                               throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");
+                       inputs[i].addObserver(this);
+               }
+
+               this.select = select;
+               select.addObserver(this);
+
+               int maxInputs = 1 << select.length();
+               if (this.inputs.length > maxInputs)
+                       throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "
+                                       + select.length() + " select bits (" + maxInputs + ").");
+
+               this.out = out;
+       }
+
+       public ReadEnd getOut()
+       {
+               return out;
+       }
+
+       public ReadEnd getSelect()
+       {
+               return select;
+       }
+
+       @Override
+       public void compute()
+       {
+               int selectValue;
+               if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
+               {
+                       out.clearSignals();
+                       return;
+               }
+
+               ReadEnd active = inputs[selectValue];
+               out.feedSignals(active.getValues());
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));
+               wires.add(select);
+               return Collections.unmodifiableList(wires);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/Splitter.java
new file mode 100644 (file)
index 0000000..9eb5b2c
--- /dev/null
@@ -0,0 +1,59 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Splitter extends Component implements WireObserver
+{
+       private ReadEnd input;
+       private ReadWriteEnd[] outputs;
+
+       public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
+       {
+               super(timeline);
+               this.input = input;
+               this.outputs = outputs;
+               input.addObserver(this);
+               int length = 0;
+               for (ReadEnd out : outputs)
+                       length += out.length();
+
+               if (input.length() != length)
+                       throw new IllegalArgumentException(
+                                       "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");
+       }
+
+       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].length()));
+                       startIndex += outputs[i].length();
+               }
+       }
+
+       @Override
+       public void update(ReadEnd initiator, BitVector oldValues)
+       {
+               compute();
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(input);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(outputs);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/TriStateBuffer.java
new file mode 100644 (file)
index 0000000..f4f1b49
--- /dev/null
@@ -0,0 +1,51 @@
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class TriStateBuffer extends BasicComponent
+{
+       ReadEnd in, enable;
+       ReadWriteEnd out;
+
+       public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
+       {
+               super(timeline, processTime);
+               if (in.length() != out.length())
+                       throw new IllegalArgumentException(
+                                       "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());
+               if (enable.length() != 1)
+                       throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");
+               this.in = in;
+               in.addObserver(this);
+               this.enable = enable;
+               enable.addObserver(this);
+               this.out = out;
+       }
+
+       @Override
+       protected void compute()
+       {
+               if (enable.getValue() == Bit.ONE)
+                       out.feedSignals(in.getValues());
+               else
+                       out.clearSignals();
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in, enable);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/AndGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/AndGate.java
new file mode 100644 (file)
index 0000000..fa1e94b
--- /dev/null
@@ -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.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class AndGate extends MultiInputGate
+{
+       public AndGate(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/MultiInputGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputGate.java
new file mode 100644 (file)
index 0000000..afc8951
--- /dev/null
@@ -0,0 +1,56 @@
+package net.mograsim.logic.core.components.gates;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.MutationOperation;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public abstract class MultiInputGate extends BasicComponent
+{
+       protected ReadEnd[] in;
+       protected ReadWriteEnd out;
+       protected final int length;
+       protected MutationOperation op;
+
+       protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
+       {
+               super(timeline, processTime);
+               this.op = op;
+               length = out.length();
+               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.length() != length)
+                               throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");
+                       w.addObserver(this);
+               }
+               this.out = out;
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+
+       @Override
+       protected void compute()
+       {
+               BitVectorMutator mutator = BitVectorMutator.empty();
+               for (ReadEnd w : in)
+                       op.apply(mutator, w.getValues());
+               out.feedSignals(mutator.get());
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/NotGate.java
new file mode 100644 (file)
index 0000000..b1cfefe
--- /dev/null
@@ -0,0 +1,50 @@
+package net.mograsim.logic.core.components.gates;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class NotGate extends BasicComponent
+{
+       private ReadEnd in;
+       private ReadWriteEnd out;
+
+       public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
+       {
+               super(timeline, processTime);
+               this.in = in;
+               in.addObserver(this);
+               this.out = out;
+       }
+
+       @Override
+       protected void compute()
+       {
+               out.feedSignals(in.getValues().not());
+       }
+
+       public ReadEnd getIn()
+       {
+               return in;
+       }
+
+       public ReadEnd getOut()
+       {
+               return out;
+       }
+
+       @Override
+       public List<ReadEnd> getAllInputs()
+       {
+               return List.of(in);
+       }
+
+       @Override
+       public List<ReadWriteEnd> getAllOutputs()
+       {
+               return List.of(out);
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/OrGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/OrGate.java
new file mode 100644 (file)
index 0000000..0072d50
--- /dev/null
@@ -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.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class OrGate extends MultiInputGate
+{
+       public OrGate(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/XorGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/XorGate.java
new file mode 100644 (file)
index 0000000..15c24e2
--- /dev/null
@@ -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.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Outputs 1 when the number of 1 inputs is odd.
+ * 
+ * @author Fabian Stemmler
+ */
+public class XorGate extends MultiInputGate
+{
+       public XorGate(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/tests/ComponentTest.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java
new file mode 100644 (file)
index 0000000..a47f792
--- /dev/null
@@ -0,0 +1,433 @@
+package net.mograsim.logic.core.tests;
+
+import static org.junit.Assert.assertTrue;
+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 java.util.function.LongConsumer;
+
+import org.junit.jupiter.api.Test;
+
+import net.mograsim.logic.core.components.Connector;
+import net.mograsim.logic.core.components.Demux;
+import net.mograsim.logic.core.components.Merger;
+import net.mograsim.logic.core.components.Mux;
+import net.mograsim.logic.core.components.Splitter;
+import net.mograsim.logic.core.components.TriStateBuffer;
+import net.mograsim.logic.core.components.gates.AndGate;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.components.gates.XorGate;
+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.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+class ComponentTest
+{
+       private Timeline t = new Timeline(11);
+
+       @Test
+       void circuitExampleTest()
+       {
+               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
+                               f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
+                               k = new Wire(t, 1, 1);
+               new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+               new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
+               new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
+               new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
+               new Splitter(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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
+               in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+               new Splitter(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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(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 Merger(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 triStateBufferTest()
+       {
+               Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
+               new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
+               new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
+               new TriStateBuffer(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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(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 Mux(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.ZERO, Bit.ONE);
+               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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(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 Demux(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.ZERO, 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.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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+               new AndGate(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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+               new OrGate(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 xorTest()
+       {
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
+               new XorGate(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()
+       {
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
+               new NotGate(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()
+       {
+               t.reset();
+               Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
+                               nq = new Wire(t, 1, 1);
+
+               new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+               new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+               new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+               new NotGate(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()
+       {
+               t.reset();
+
+               Wire a = new Wire(t, 4, 1);
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
+
+               t.executeAll();
+
+               assertEquals(15, a.getUnsignedValue());
+               assertEquals(-1, a.getSignedValue());
+       }
+
+       boolean flag = false;
+
+       @Test
+       void simpleTimelineTest()
+       {
+               Timeline t = new Timeline(3);
+               flag = false;
+               t.addEvent((e) ->
+               {
+                       if (!flag)
+                               fail();
+                       flag = false;
+               }, 15);
+               t.addEvent((e) ->
+               {
+                       if (flag)
+                               fail();
+                       flag = true;
+               }, 10);
+               t.addEvent((e) ->
+               {
+                       if (flag)
+                               fail();
+                       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();
+       }
+
+       @Test
+       void multipleInputs()
+       {
+               t.reset();
+               Wire w = new Wire(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.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));
+               t.executeAll();
+               rE.close();
+               wI1.feedSignals(Bit.X, Bit.X);
+               t.executeAll();
+               wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));
+               wI1.close();
+               assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
+       }
+
+       @Test
+       void wireConnections()
+       {
+               // Nur ein Experiment, was Ã¼ber mehrere 'passive' Bausteine hinweg passieren würde
+
+               t.reset();
+
+               Wire a = new Wire(t, 1, 2);
+               Wire b = new Wire(t, 1, 2);
+               Wire c = new Wire(t, 1, 2);
+               ReadWriteEnd aI = a.createReadWriteEnd();
+               ReadWriteEnd bI = b.createReadWriteEnd();
+               ReadWriteEnd cI = c.createReadWriteEnd();
+
+               TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
+               TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
+               LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);
+
+               cI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+
+               cI.feedSignals(Bit.X);
+               test.assertAfterSimulationIs(print, Bit.X);
+
+               cI.feedSignals(Bit.X);
+               cI.feedSignals(Bit.Z);
+               test.assertAfterSimulationIs(print, Bit.Z);
+
+               new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
+               test.assertAfterSimulationIs(print, Bit.Z);
+               System.err.println("ONE");
+               bI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+               System.err.println("ZERO");
+               bI.feedSignals(Bit.ZERO);
+               test.assertAfterSimulationIs(print, Bit.ZERO);
+               System.err.println("Z");
+               bI.feedSignals(Bit.Z);
+               test.assertAfterSimulationIs(print, Bit.Z);
+
+               new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
+               System.err.println("Z 2");
+               aI.feedSignals(Bit.Z);
+               test.assertAfterSimulationIs(print, Bit.Z);
+               test2.assertAfterSimulationIs(Bit.Z);
+               System.err.println("ONE 2");
+               aI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+               test2.assertAfterSimulationIs(Bit.ONE);
+               System.err.println("ZERO 2");
+               aI.feedSignals(Bit.ZERO);
+               test.assertAfterSimulationIs(print, Bit.ZERO);
+               test2.assertAfterSimulationIs(Bit.ZERO);
+               System.err.println("Z 2 II");
+               aI.feedSignals(Bit.Z);
+               test.assertAfterSimulationIs(print, Bit.Z);
+               test2.assertAfterSimulationIs(Bit.Z);
+
+               System.err.println("No Conflict yet");
+               bI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+               test2.assertAfterSimulationIs(Bit.ONE);
+               aI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+               test2.assertAfterSimulationIs(Bit.ONE);
+               System.err.println("Conflict");
+               aI.feedSignals(Bit.ZERO);
+               test.assertAfterSimulationIs(print, Bit.X);
+               test2.assertAfterSimulationIs(Bit.X);
+               aI.feedSignals(Bit.ONE);
+               test.assertAfterSimulationIs(print, Bit.ONE);
+               test2.assertAfterSimulationIs(Bit.ONE);
+       }
+
+       private static void assertBitArrayEquals(BitVector actual, Bit... expected)
+       {
+               assertArrayEquals(expected, actual.getBits());
+       }
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/GUITest.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/GUITest.java
new file mode 100644 (file)
index 0000000..7d06621
--- /dev/null
@@ -0,0 +1,301 @@
+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.ManualSwitch;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
+import net.mograsim.logic.core.wires.Wire;
+
+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);
+
+       Wire r = new Wire(t, 1, WIRE_DELAY);
+       Wire s = new Wire(t, 1, WIRE_DELAY);
+       Wire t1 = new Wire(t, 1, WIRE_DELAY);
+       Wire t2 = new Wire(t, 1, WIRE_DELAY);
+       Wire q = new Wire(t, 1, WIRE_DELAY);
+       Wire nq = new Wire(t, 1, WIRE_DELAY);
+
+       ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
+       ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
+
+       OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+       OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+       NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+       NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+
+       Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
+
+       int height;
+       int width;
+       boolean sizeChanged;
+
+       public GUITest()
+       {
+               addMouseListener(new MouseListener()
+               {
+
+                       @Override
+                       public void mouseReleased(MouseEvent e)
+                       {
+                               for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
+                               {
+                                       if (dim.getValue().contains(e.getPoint()))
+                                       {
+                                               dim.getKey().switchOff();
+                                               repaint();
+                                       }
+                               }
+                       }
+
+                       @Override
+                       public void mousePressed(MouseEvent e)
+                       {
+                               for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
+                               {
+                                       if (dim.getValue().contains(e.getPoint()))
+                                       {
+                                               dim.getKey().switchOn();
+                                               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<ManualSwitch, Rectangle> 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));
+       }
+
+       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, Wire 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, ManualSwitch 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.isOn() ? 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, Wire 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/src/net/mograsim/logic/core/tests/TestBitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/tests/TestBitDisplay.java
new file mode 100644 (file)
index 0000000..015e257
--- /dev/null
@@ -0,0 +1,47 @@
+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.BitDisplay;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public final class TestBitDisplay extends BitDisplay
+{
+
+       public TestBitDisplay(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 void compute()
+       {
+               super.compute();
+               System.out.println("update: value is " + getDisplayedValue());
+       }
+}
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
new file mode 100644 (file)
index 0000000..fb639be
--- /dev/null
@@ -0,0 +1,203 @@
+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<InnerEvent> events;
+       private LongSupplier time;
+       private long lastTimeUpdated = 0;
+
+       private final List<Consumer<TimelineEvent>> eventAddedListener;
+
+       public Timeline(int initCapacity)
+       {
+               events = new PriorityQueue<InnerEvent>(initCapacity);
+
+               eventAddedListener = new ArrayList<>();
+               time = () -> lastTimeUpdated;
+       }
+
+       /**
+        * @param timestamp exclusive
+        * @return true if the first event is later than the timestamp
+        */
+       public BooleanSupplier laterThan(long timestamp)
+       {
+               return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;
+       }
+
+       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);
+       }
+
+       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
+        * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty
+        * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached
+        * <code>EXEC_UNTIL_CONDITION</code> if the condition was met
+        * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty
+        * @formatter:on
+        * @author Christian Femers, Fabian Stemmler
+        */
+       public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)
+       {
+               if (events.isEmpty())
+               {
+                       lastTimeUpdated = getSimulationTime();
+                       return ExecutionResult.NOTHING_DONE;
+               }
+               int checkStop = 0;
+               InnerEvent first = events.peek();
+               while (hasNext() && !condition.getAsBoolean())
+               {
+                       events.remove();
+                       lastTimeUpdated = first.getTiming();
+                       first.run();
+                       // Don't check after every run
+                       checkStop = (checkStop + 1) % 10;
+                       if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
+                               return ExecutionResult.EXEC_OUT_OF_TIME;
+                       first = events.peek();
+               }
+               lastTimeUpdated = getSimulationTime();
+               return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;
+       }
+
+       public void setTimeFunction(LongSupplier time)
+       {
+               this.time = time;
+       }
+
+       public long getSimulationTime()
+       {
+               return time.getAsLong();
+       }
+
+       public long nextEventTime()
+       {
+               if (!hasNext())
+                       return -1;
+               return events.peek().getTiming();
+       }
+
+       public void reset()
+       {
+               events.clear();
+               lastTimeUpdated = 0;
+       }
+
+       public void addEventAddedListener(Consumer<TimelineEvent> listener)
+       {
+               eventAddedListener.add(listener);
+       }
+
+       public void removeEventAddedListener(Consumer<TimelineEvent> 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);
+               events.add(new InnerEvent(function, event));
+               eventAddedListener.forEach(l -> l.accept(event));
+       }
+
+       private class InnerEvent implements Runnable, Comparable<InnerEvent>
+       {
+               private final TimelineEventHandler function;
+               private final TimelineEvent event;
+
+               /**
+                * 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)
+               {
+                       this.function = function;
+                       this.event = event;
+               }
+
+               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)
+               {
+                       return timeCmp(getTiming(), o.getTiming());
+               }
+       }
+
+       public static int timeCmp(long a, long b)
+       {
+               return Long.signum(a - b);
+       }
+
+       @Override
+       public String toString()
+       {
+               return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());
+       }
+
+       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
new file mode 100644 (file)
index 0000000..c46e6ad
--- /dev/null
@@ -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/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
new file mode 100644 (file)
index 0000000..badbabc
--- /dev/null
@@ -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/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
new file mode 100644 (file)
index 0000000..fbfd0d5
--- /dev/null
@@ -0,0 +1,132 @@
+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<Bit>
+{
+       U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z");
+
+       private final String symbol;
+
+       private Bit(String symbol)
+       {
+               this.symbol = symbol;
+       }
+
+       @Override
+       public Bit and(Bit other)
+       {
+               return fromTable(AND_TABLE, this, other);
+       }
+
+       @Override
+       public Bit or(Bit other)
+       {
+               return fromTable(OR_TABLE, this, other);
+       }
+
+       @Override
+       public Bit xor(Bit other)
+       {
+               return fromTable(XOR_TABLE, this, other);
+       }
+
+       @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(int length)
+       {
+               return BitVector.of(this, length);
+       }
+
+       @Override
+       public Bit join(Bit other)
+       {
+               return fromTable(JOIN_TABLE, this, other);
+       }
+
+       @Override
+       public String toString()
+       {
+               return getSymbol();
+       }
+
+       public String getSymbol()
+       {
+               return symbol;
+       }
+
+       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<String, Bit> 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
new file mode 100644 (file)
index 0000000..1e87f9a
--- /dev/null
@@ -0,0 +1,316 @@
+package net.mograsim.logic.core.types;
+
+import static java.lang.String.format;
+
+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<BitVector>, Iterable<Bit>, RandomAccess
+{
+       private final Bit[] bits;
+
+       private BitVector(Bit[] bits)
+       {
+               this.bits = Objects.requireNonNull(bits);
+       }
+
+       public static BitVector of(Bit... bits)
+       {
+               return new BitVector(bits.clone());
+       }
+
+       public static BitVector of(Bit bit, int length)
+       {
+               return new BitVector(bit.makeArray(length));
+       }
+
+       public BitVectorMutator mutator()
+       {
+               return BitVectorMutator.of(this);
+       }
+
+       public Bit getBit(int bitIndex)
+       {
+               return bits[bitIndex];
+       }
+
+       public Bit[] getBits()
+       {
+               return bits.clone();
+       }
+
+       @Override
+       public BitVector join(BitVector t)
+       {
+               checkCompatibility(t);
+               return new BitVector(binOp(bits.clone(), t.bits, Bit::join));
+       }
+
+       @Override
+       public BitVector and(BitVector t)
+       {
+               checkCompatibility(t);
+               return new BitVector(binOp(bits.clone(), t.bits, Bit::and));
+       }
+
+       @Override
+       public BitVector or(BitVector t)
+       {
+               checkCompatibility(t);
+               return new BitVector(binOp(bits.clone(), t.bits, Bit::or));
+       }
+
+       @Override
+       public BitVector xor(BitVector t)
+       {
+               checkCompatibility(t);
+               return new BitVector(binOp(bits.clone(), t.bits, Bit::xor));
+       }
+
+       @Override
+       public BitVector not()
+       {
+               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<Bit> 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<Bit> 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
+        */
+       @SuppressWarnings("synthetic-access")
+       public static final class BitVectorMutator implements LogicType<BitVectorMutator, BitVector>
+       {
+               private Bit[] bits;
+
+               private BitVectorMutator(Bit[] bits)
+               {
+                       this.bits = bits;
+               }
+
+               static BitVectorMutator of(BitVector bv)
+               {
+                       return new BitVectorMutator(bv.getBits());
+               }
+
+               /**
+                * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed.
+                * 
+                */
+               public static BitVectorMutator empty()
+               {
+                       return new BitVectorMutator(null);
+               }
+
+               /**
+                * Produces the resulting, immutable {@link BitVector}<br>
+                * 
+                * @throws IllegalStateException if the mutator is (still) empty
+                */
+               public BitVector get()
+               {
+                       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;
+               }
+
+               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 <code>offset</code> to the right.<br>
+        * Therefore <code>offset + other.length() <= this.length()</code> needs to be true.
+        * 
+        * @throws ArrayIndexOutOfBoundsException if <code>offset + other.length() > this.length()</code>
+        * 
+        * @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
+        * 
+        * @see #parse(String)
+        */
+       @Override
+       public String toString()
+       {
+               StringBuilder sb = new StringBuilder(bits.length);
+               for (Bit bit : bits)
+                       sb.append(bit);
+               return sb.toString();
+       }
+
+       /**
+        * Parses a String containing solely {@link Bit} symbols
+        * 
+        * @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);
+       }
+
+       @Override
+       public Iterator<Bit> iterator()
+       {
+               return new Iterator<>()
+               {
+                       private int pos = 0;
+
+                       @Override
+                       public Bit next()
+                       {
+                               if (!hasNext())
+                                       throw new NoSuchElementException();
+                               return getBit(pos++);
+                       }
+
+                       @Override
+                       public boolean hasNext()
+                       {
+                               return pos != length();
+                       }
+               };
+       }
+}
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
new file mode 100644 (file)
index 0000000..a798531
--- /dev/null
@@ -0,0 +1,53 @@
+package net.mograsim.logic.core.types;
+
+import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+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";
+               else
+                       return bitVector.toString();
+       }
+
+       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);
+               else
+                       switch (bitVector.getBit(0))
+                       {
+                       case ONE:
+                               return new ColorDefinition(BuiltInColor.COLOR_GREEN);
+                       case U:
+                               return new ColorDefinition(BuiltInColor.COLOR_CYAN);
+                       case X:
+                               return new ColorDefinition(BuiltInColor.COLOR_RED);
+                       case Z:
+                               return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
+                       case ZERO:
+                               return new ColorDefinition(BuiltInColor.COLOR_GRAY);
+                       default:
+                               throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(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/ColorDefinition.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/ColorDefinition.java
new file mode 100644 (file)
index 0000000..2801736
--- /dev/null
@@ -0,0 +1,54 @@
+package net.mograsim.logic.core.types;
+
+/**
+ * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT).
+ * <p>
+ * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case <code>r==g==b==-1</code>, or by red / green
+ * / blue components, in which case <code>builtInColor==null</code>
+ */
+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;
+       }
+
+       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.logic.core/src/net/mograsim/logic/core/types/LogicType.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java
new file mode 100644 (file)
index 0000000..39ae681
--- /dev/null
@@ -0,0 +1,130 @@
+package net.mograsim.logic.core.types;
+
+/**
+ * Interface for types that support the basic logic operations
+ *
+ * @author Christian Femers
+ *
+ * @param <T> the logic type itself, to make the operations closed in T
+ * @param <S> the operand type, may be the same as T, see {@link StrictLogicType}
+ */
+public interface LogicType<T extends LogicType<T, S>, S>
+{
+       /**
+        * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164)
+        * 
+        * For example:
+        * 
+        * <pre>
+        * 0 joined 0 == 0
+        * 1 joined 0 == X
+        * 0 joined 1 == X
+        * 1 joined 1 == 1
+        * </pre>
+        * 
+        * @param t the second logic signal
+        * @return the resulting value
+        * @author Christian Femers
+        */
+       T join(S t);
+
+       /**
+        * Classical logic AND
+        * 
+        * For example:
+        * 
+        * <pre>
+        * 0 AND 0 == 0
+        * 1 AND 0 == 0
+        * 0 AND 1 == 0
+        * 1 AND 1 == 1
+        * </pre>
+        * 
+        * @param t the second logic signal
+        * @return the resulting value
+        * @author Christian Femers
+        */
+       T and(S t);
+
+       /**
+        * Classical logic OR
+        *
+        * For example:
+        * 
+        * <pre>
+        * 0 OR 0 == 0
+        * 1 OR 0 == 1
+        * 0 OR 1 == 1
+        * 1 OR 1 == 1
+        * </pre>
+        * 
+        * @param t the second logic signal
+        * @return the resulting value
+        * @author Christian Femers
+        */
+       T or(S t);
+
+       /**
+        * Classical logic XOR (exclusive OR)
+        * 
+        * For example:
+        * 
+        * <pre>
+        * 0 XOR 0 == 0
+        * 1 XOR 0 == 1
+        * 0 XOR 1 == 1
+        * 1 XOR 1 == 0
+        * </pre>
+        * 
+        * @param t the second logic signal
+        * @return the resulting value
+        * @author Christian Femers
+        */
+       T xor(S t);
+
+       /**
+        * Classical logic NOT (logical negation)
+        * 
+        * For example:
+        * 
+        * <pre>
+        * NOT 0 == 1
+        * NOT 1 == 0
+        * </pre>
+        * 
+        * @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}<br>
+        * 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
new file mode 100644 (file)
index 0000000..1fdae21
--- /dev/null
@@ -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<BitVectorMutator, BitVector, BitVectorMutator>
+{
+       // 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
new file mode 100644 (file)
index 0000000..c830b58
--- /dev/null
@@ -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 <T> the logic type itself to make the operations closed
+ */
+public interface StrictLogicType<T extends StrictLogicType<T>> extends LogicType<T, T>
+{
+       // this is just a matter of type parameters
+}
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java
new file mode 100644 (file)
index 0000000..d73ee61
--- /dev/null
@@ -0,0 +1,492 @@
+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.List;
+
+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 Wire
+{
+       private BitVector values;
+       public final int travelTime;
+       private List<ReadEnd> attached = new ArrayList<ReadEnd>();
+       public final int length;
+       private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();
+       private Timeline timeline;
+
+       public Wire(Timeline timeline, int length, int travelTime)
+       {
+               if (length < 1)
+                       throw new IllegalArgumentException(
+                                       String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
+               this.timeline = timeline;
+               this.length = length;
+               this.travelTime = travelTime;
+               initValues();
+       }
+
+       private void initValues()
+       {
+               values = U.toVector(length);
+       }
+
+       private void recalculateSingleInput()
+       {
+               setNewValues(inputs.get(0).getInputValues());
+       }
+
+       private void recalculateMultipleInputs()
+       {
+               BitVectorMutator mutator = BitVectorMutator.empty();
+               for (ReadWriteEnd wireArrayEnd : inputs)
+                       mutator.join(wireArrayEnd.getInputValues());
+               setNewValues(mutator.get());
+       }
+
+       private void setNewValues(BitVector newValues)
+       {
+               if (values.equals(newValues))
+                       return;
+               BitVector oldValues = values;
+               values = newValues;
+               notifyObservers(oldValues);
+       }
+
+       private void recalculate()
+       {
+               switch (inputs.size())
+               {
+               case 0:
+                       return;
+               case 1:
+                       recalculateSingleInput();
+                       break;
+               default:
+                       recalculateMultipleInputs();
+               }
+       }
+
+       /**
+        * The {@link Wire} is interpreted as an unsigned integer with n bits.
+        * 
+        * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the same
+        *         value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
+        * 
+        * @author Fabian Stemmler
+        */
+       public boolean hasNumericValue()
+       {
+               for (Bit b : values)
+               {
+                       if (b != Bit.ZERO && b != Bit.ONE)
+                               return false;
+               }
+               return true;
+       }
+
+       /**
+        * The {@link Wire} is interpreted as an unsigned integer with n bits.
+        * 
+        * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+        * 
+        * @author Fabian Stemmler
+        */
+       public long getUnsignedValue()
+       {
+               long val = 0;
+               long mask = 1;
+               for (Bit bit : values)
+               {
+                       switch (bit)
+                       {
+                       default:
+                       case Z:
+                       case X:
+                               return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;
+                       case ONE:
+                               val |= mask;
+                               break;
+                       case ZERO:
+                       }
+                       mask = mask << 1;
+               }
+               return val;
+       }
+
+       /**
+        * The {@link Wire} is interpreted as a signed integer with n bits.
+        * 
+        * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+        * 
+        * @author Fabian Stemmler
+        */
+       public long getSignedValue()
+       {
+               long val = getUnsignedValue();
+               long mask = 1 << (length - 1);
+               if ((mask & val) != 0)
+               {
+                       int shifts = 64 - length;
+                       return (val << shifts) >> shifts;
+               }
+               return val;
+       }
+
+       public Bit getValue()
+       {
+               return getValue(0);
+       }
+
+       public Bit getValue(int index)
+       {
+               return values.getBit(index);
+       }
+
+       public BitVector getValues(int start, int end)
+       {
+               return values.subVector(start, end);
+       }
+
+       public BitVector getValues()
+       {
+               return values;
+       }
+
+       /**
+        * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated.
+        * 
+        * @param ob The {@link WireObserver} to be notified of changes.
+        * @return true if the given {@link WireObserver} was not already registered, false otherwise
+        * 
+        * @author Fabian Stemmler
+        */
+       private void attachEnd(ReadEnd end)
+       {
+               attached.add(end);
+       }
+
+       private void detachEnd(ReadEnd end)
+       {
+               attached.remove(end);
+       }
+
+       private void notifyObservers(BitVector oldValues)
+       {
+               for (ReadEnd o : attached)
+                       o.update(oldValues);
+       }
+
+       /**
+        * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link Wire}. This {@link ReadWriteEnd} can be written to.
+        */
+       public ReadWriteEnd createReadWriteEnd()
+       {
+               return new ReadWriteEnd();
+       }
+
+       /**
+        * Create a {@link ReadEnd} object, which is tied to this {@link Wire}. This {@link ReadEnd} cannot be written to.
+        */
+       public ReadEnd createReadOnlyEnd()
+       {
+               return new ReadEnd();
+       }
+
+       private void registerInput(ReadWriteEnd toRegister)
+       {
+               inputs.add(toRegister);
+       }
+
+       /**
+        * A {@link ReadEnd} feeds a constant signal into the {@link Wire} it is tied to. The combination of all inputs determines the
+        * {@link Wire}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
+       {
+               private List<WireObserver> observers = new ArrayList<WireObserver>();
+
+               private ReadEnd()
+               {
+                       super();
+                       Wire.this.attachEnd(this);
+               }
+
+               public void update(BitVector oldValues)
+               {
+                       for (WireObserver ob : observers)
+                               ob.update(this, oldValues);
+               }
+
+               /**
+                * Included for convenient use on {@link Wire}s of length 1.
+                * 
+                * @return The value of bit 0.
+                * 
+                * @author Fabian Stemmler
+                */
+               public Bit getValue()
+               {
+                       return Wire.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 Wire.this.getValue(index);
+               }
+
+               /**
+                * @param index Index of the requested bit.
+                * @return The value of the indexed bit.
+                * 
+                * @author Fabian Stemmler
+                */
+               public BitVector getValues()
+               {
+                       return Wire.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 Wire.this.getValues(start, end);
+               }
+
+               /**
+                * The {@link Wire} is interpreted as an unsigned integer with n bits.
+                * 
+                * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the
+                *         same value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
+                * 
+                * @author Fabian Stemmler
+                */
+               public boolean hasNumericValue()
+               {
+                       return Wire.this.hasNumericValue();
+               }
+
+               /**
+                * The {@link Wire} is interpreted as an unsigned integer with n bits.
+                * 
+                * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+                * 
+                * @author Fabian Stemmler
+                */
+               public long getUnsignedValue()
+               {
+                       return Wire.this.getUnsignedValue();
+               }
+
+               /**
+                * The {@link Wire} is interpreted as a signed integer with n bits.
+                * 
+                * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+                * 
+                * @author Fabian Stemmler
+                */
+               public long getSignedValue()
+               {
+                       return Wire.this.getSignedValue();
+               }
+
+               @Override
+               public String toString()
+               {
+                       return Wire.this.toString();
+               }
+
+               public void close()
+               {
+                       inputs.remove(this);
+                       detachEnd(this);
+                       recalculate();
+               }
+
+               public int length()
+               {
+                       return length;
+               }
+
+               public boolean addObserver(WireObserver ob)
+               {
+                       return observers.add(ob);
+               }
+
+               public Wire getWire()
+               {
+                       return Wire.this;
+               }
+       }
+
+       public class ReadWriteEnd extends ReadEnd
+       {
+               private boolean open;
+               private BitVector inputValues;
+
+               private ReadWriteEnd()
+               {
+                       super();
+                       open = true;
+                       initValues();
+                       registerInput(this);
+               }
+
+               private void initValues()
+               {
+                       inputValues = U.toVector(length);
+               }
+
+               /**
+                * Sets the wires values. This takes up time, as specified by the {@link Wire}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));
+               }
+
+               public void feedSignals(BitVector newValues)
+               {
+                       if (newValues.length() != length)
+                               throw new IllegalArgumentException(
+                                               String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));
+                       if (!open)
+                               throw new RuntimeException("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 Wire}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 RuntimeException("Attempted to write to closed WireArrayEnd.");
+                       timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);
+               }
+
+               private 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);
+                               Wire.this.recalculate();
+                       }
+               }
+
+               private void setValues(BitVector newValues)
+               {
+                       if (inputValues.equals(newValues))
+                               return;
+                       inputValues = newValues;
+                       Wire.this.recalculate();
+               }
+
+               /**
+                * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
+                */
+               public Bit getInputValue()
+               {
+                       return getInputValue(0);
+               }
+
+               /**
+                * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link Wire} at the indexed {@link Bit}.
+                */
+               public Bit getInputValue(int index)
+               {
+                       return inputValues.getBit(index);
+               }
+
+               /**
+                * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
+                */
+               public BitVector getInputValues()
+               {
+                       return getInputValues(0, length);
+               }
+
+               public BitVector getInputValues(int start, int end)
+               {
+                       return inputValues.subVector(start, end);
+               }
+
+               /**
+                * {@link ReadEnd} now feeds Z into the associated {@link Wire}.
+                */
+               public void clearSignals()
+               {
+                       feedSignals(Z.toVector(length));
+               }
+
+               public BitVector wireValuesExcludingMe()
+               {
+                       BitVectorMutator mutator = BitVectorMutator.empty();
+                       for (ReadWriteEnd wireEnd : inputs)
+                       {
+                               if (wireEnd == this)
+                                       continue;
+                               mutator.join(wireEnd.inputValues);
+                       }
+                       return mutator.get();
+               }
+
+               @Override
+               public String toString()
+               {
+                       return inputValues.toString();
+               }
+       }
+
+       @Override
+       public String toString()
+       {
+               return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs);
+               // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)
+       }
+
+       public static ReadEnd[] extractEnds(Wire[] w)
+       {
+               ReadEnd[] inputs = new ReadEnd[w.length];
+               for (int i = 0; i < w.length; i++)
+                       inputs[i] = w[i].createReadWriteEnd();
+               return inputs;
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/WireObserver.java
new file mode 100644 (file)
index 0000000..66914b4
--- /dev/null
@@ -0,0 +1,9 @@
+package net.mograsim.logic.core.wires;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public interface WireObserver
+{
+       public void update(ReadEnd initiator, BitVector oldValues);
+}
diff --git a/net.mograsim.logic.ui/.classpath b/net.mograsim.logic.ui/.classpath
new file mode 100644 (file)
index 0000000..bde0882
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
+               <attributes>
+                       <attribute name="module" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/net.mograsim.logic.ui/.gitignore b/net.mograsim.logic.ui/.gitignore
new file mode 100644 (file)
index 0000000..ae3c172
--- /dev/null
@@ -0,0 +1 @@
+/bin/
diff --git a/net.mograsim.logic.ui/.project b/net.mograsim.logic.ui/.project
new file mode 100644 (file)
index 0000000..8ce0afd
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>net.mograsim.logic.ui</name>
+       <comment></comment>
+       <projects>
+               <project>net.mograsim.logic.core</project>
+               <project>SWTZoomableCanvas</project>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/net.mograsim.logic.ui/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..2196a4a
--- /dev/null
@@ -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=10
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=10
+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=10
+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.ui/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644 (file)
index 0000000..8f2c0a4
--- /dev/null
@@ -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/net.mograsim.logic.ui/META-INF/MANIFEST.MF b/net.mograsim.logic.ui/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..24a1c9a
--- /dev/null
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: net.mograsim.logic.ui
+Bundle-SymbolicName: net.mograsim.logic.ui;singleton:=true
+Bundle-Version: 1.0.0
+Export-Package: net.mograsim.logic.ui,
+ net.mograsim.logic.ui.examples,
+ net.mograsim.logic.ui.model,
+ net.mograsim.logic.ui.model.components,
+ net.mograsim.logic.ui.model.wires,
+ net.mograsim.logic.ui.modeladapter,
+ net.mograsim.logic.ui.modeladapter.componentadapters
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+Require-Bundle: org.eclipse.swt;bundle-version="3.110.0",
+ SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport,
+ net.mograsim.logic.core;bundle-version="1.0.0";visibility:=reexport
+Automatic-Module-Name: net.mograsim.logic.ui
diff --git a/net.mograsim.logic.ui/build.properties b/net.mograsim.logic.ui/build.properties
new file mode 100644 (file)
index 0000000..b107977
--- /dev/null
@@ -0,0 +1,3 @@
+source.. = src/
+bin.includes = META-INF/,\
+               .
diff --git a/net.mograsim.logic.ui/oldsrc/GUIMerger.java b/net.mograsim.logic.ui/oldsrc/GUIMerger.java
new file mode 100644 (file)
index 0000000..64fd0aa
--- /dev/null
@@ -0,0 +1,79 @@
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.logic.components.Merger;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUIMerger extends Merger implements GUIComponent
+{
+       private final int inputCount;
+       private final double height;
+       private final List<ReadEnd> connectedWireEnds;
+       private final List<Point> WireEndConnectionPoints;
+
+       public GUIMerger(ReadWriteEnd union, ReadEnd... inputs)
+       {
+               super(union, inputs);
+
+               List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
+               List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
+
+               this.inputCount = inputs.length;
+               this.height = (inputCount - 1) * 10;
+
+               {
+                       connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
+                       double inputHeight = 0;
+                       for (int i = 0; i < inputCount; i++, inputHeight += 10)
+                               WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
+               }
+
+               connectedWireEndsModifiable.add(union);
+               WireEndConnectionPointsModifiable.add(new Point(20, height / 2));
+
+               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+       }
+
+       @Override
+       public Rectangle getBounds()
+       {
+               return new Rectangle(0, 0, 20, height);
+       }
+
+       @Override
+       public void render(GeneralGC gc)
+       {
+               double inputHeight = 0;
+               for (int i = 0; i < inputCount; i++, inputHeight += 10)
+                       gc.drawLine(0, inputHeight, 10, inputHeight);
+               gc.drawLine(10, 0, 10, height);
+               gc.drawLine(10, height / 2, 20, height / 2);
+       }
+
+       @Override
+       public int getConnectedWireEndsCount()
+       {
+               return connectedWireEnds.size();
+       }
+
+       @Override
+       public ReadEnd getConnectedWireEnd(int connectionIndex)
+       {
+               return connectedWireEnds.get(connectionIndex);
+       }
+
+       @Override
+       public Point getWireEndConnectionPoint(int connectionI)
+       {
+               return WireEndConnectionPoints.get(connectionI);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/oldsrc/GUIMux.java b/net.mograsim.logic.ui/oldsrc/GUIMux.java
new file mode 100644 (file)
index 0000000..d004d90
--- /dev/null
@@ -0,0 +1,80 @@
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.logic.components.Mux;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUIMux extends Mux implements GUIComponent
+{
+       private final double height;
+       private final List<ReadEnd> connectedWireEnds;
+       private final List<Point> WireEndConnectionPoints;
+
+       public GUIMux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+       {
+               super(processTime, out, select, inputs);
+
+               double height = inputs.length * 5;
+               if (height < 10)
+                       height = 10;
+               this.height = height;
+
+               List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
+               List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
+
+               connectedWireEndsModifiable.add(out);
+               WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));
+
+               connectedWireEndsModifiable.add(select);
+               WireEndConnectionPointsModifiable.add(new Point(10, 5));
+
+               {
+                       connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
+                       double inputHeightIncrement = (height + 20) / inputs.length;
+                       double inputHeight = inputHeightIncrement / 2;
+                       for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)
+                               WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
+               }
+
+               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+       }
+
+       @Override
+       public Rectangle getBounds()
+       {
+               return new Rectangle(0, 0, 20, height + 20);
+       }
+
+       @Override
+       public void render(GeneralGC gc)
+       {
+               gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });
+       }
+
+       @Override
+       public int getConnectedWireEndsCount()
+       {
+               return connectedWireEnds.size();
+       }
+
+       @Override
+       public ReadEnd getConnectedWireEnd(int connectionIndex)
+       {
+               return connectedWireEnds.get(connectionIndex);
+       }
+
+       @Override
+       public Point getWireEndConnectionPoint(int connectionI)
+       {
+               return WireEndConnectionPoints.get(connectionI);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/oldsrc/GUISplitter.java b/net.mograsim.logic.ui/oldsrc/GUISplitter.java
new file mode 100644 (file)
index 0000000..1bff424
--- /dev/null
@@ -0,0 +1,72 @@
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.gui.ViewModel;
+import era.mi.logic.components.Splitter;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUISplitter extends GUIComponent
+{
+       public GUISplitter(ViewModel model)
+       {
+               super(model);
+
+               this.outputCount = outputs.length;
+               this.height = (outputCount - 1) * 10;
+
+               connectedWireEndsModifiable.add(input);
+               WireEndConnectionPointsModifiable.add(new Point(0, height / 2));
+
+               {
+                       connectedWireEndsModifiable.addAll(Arrays.asList(outputs));
+                       double outputHeight = 0;
+                       for (int i = 0; i < outputCount; i++, outputHeight += 10)
+                               WireEndConnectionPointsModifiable.add(new Point(20, outputHeight));
+               }
+
+               this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+               this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+       }
+
+       @Override
+       public Rectangle getBounds()
+       {
+               return new Rectangle(0, 0, 20, height);
+       }
+
+       @Override
+       public void render(GeneralGC gc)
+       {
+               gc.drawLine(0, height / 2, 10, height / 2);
+               gc.drawLine(10, 0, 10, height);
+               double outputHeight = 0;
+               for (int i = 0; i < outputCount; i++, outputHeight += 10)
+                       gc.drawLine(10, outputHeight, 20, outputHeight);
+       }
+
+       @Override
+       public int getConnectedWireEndsCount()
+       {
+               return connectedWireEnds.size();
+       }
+
+       @Override
+       public ReadEnd getConnectedWireEnd(int connectionIndex)
+       {
+               return connectedWireEnds.get(connectionIndex);
+       }
+
+       @Override
+       public Point getWireEndConnectionPoint(int connectionI)
+       {
+               return WireEndConnectionPoints.get(connectionI);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/ColorHelper.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/ColorHelper.java
new file mode 100644 (file)
index 0000000..b631507
--- /dev/null
@@ -0,0 +1,91 @@
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.mograsim.logic.core.types.ColorDefinition;
+import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
+
+//TODO replace with a proper ColorManager
+public class ColorHelper
+{
+       public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
+       {
+               executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
+       }
+
+       public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
+       {
+               executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
+       }
+
+       private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
+                       Runnable exec)
+       {
+               Color oldColor = getColor.get();
+               boolean isNoSystemColor = col.builtInColor == null;
+               Color newColor;
+               if (isNoSystemColor)
+                       newColor = new Color(device, col.r, col.g, col.b);
+               else
+                       newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
+               setColor.accept(newColor);
+
+               exec.run();
+
+               setColor.accept(oldColor);
+               if (isNoSystemColor)
+                       newColor.dispose();
+       }
+
+       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);
+               }
+       }
+
+       private ColorHelper()
+       {
+               throw new UnsupportedOperationException("No instances of ColorHelper");
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicExecuter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicExecuter.java
new file mode 100644 (file)
index 0000000..fadfbe9
--- /dev/null
@@ -0,0 +1,105 @@
+package net.mograsim.logic.ui;
+
+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 LogicModel 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();
+                       }
+                       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
+                               }
+                       }
+                       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.ui/src/net/mograsim/logic/ui/LogicUICanvas.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUICanvas.java
new file mode 100644 (file)
index 0000000..3a08097
--- /dev/null
@@ -0,0 +1,114 @@
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+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.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.Pin;
+
+/**
+ * Simulation visualizer canvas.
+ * 
+ * @author Daniel Kirschten
+ */
+public class LogicUICanvas extends ZoomableCanvas
+{
+       private static final boolean DRAW_PINS = false;
+
+       private final ViewModel model;
+
+       public LogicUICanvas(Composite parent, int style, ViewModel model)
+       {
+               super(parent, style);
+
+               this.model = model;
+
+               Consumer<Object> redrawConsumer = o -> redrawThreadsafe();
+               Consumer<Pin> pinAddedListener = p ->
+               {
+                       p.addPinMovedListener(redrawConsumer);
+                       redrawThreadsafe();
+               };
+               Consumer<Pin> pinRemovedListener = p ->
+               {
+                       p.removePinMovedListener(redrawConsumer);
+                       redrawThreadsafe();
+               };
+               Consumer<? super GUIComponent> componentAddedListener = c ->
+               {
+                       c.addComponentLookChangedListener(redrawConsumer);
+                       c.addComponentMovedListener(redrawConsumer);
+                       c.addPinAddedListener(pinAddedListener);
+                       c.addPinRemovedListener(pinRemovedListener);
+                       redrawThreadsafe();
+               };
+               model.addComponentAddedListener(componentAddedListener);
+               model.getComponents().forEach(componentAddedListener);
+               model.addComponentRemovedListener(c ->
+               {
+                       c.removeComponentLookChangedListener(redrawConsumer);
+                       c.removeComponentMovedListener(redrawConsumer);
+                       c.removePinAddedListener(pinAddedListener);
+                       c.removePinRemovedListener(pinRemovedListener);
+                       redrawThreadsafe();
+               });
+               Consumer<? super GUIWire> wireAddedListener = w ->
+               {
+                       w.addWireLookChangedListener(redrawConsumer);
+                       redrawThreadsafe();
+               };
+               model.addWireAddedListener(wireAddedListener);
+               model.getWires().forEach(wireAddedListener);
+               model.addWireRemovedListener(w ->
+               {
+                       w.removeWireLookChangedListener(redrawConsumer);
+                       redrawThreadsafe();
+               });
+
+               addZoomedRenderer(gc ->
+               {
+                       gc.setLineWidth(.5);
+                       model.getWires().forEach(w -> w.render(gc));
+                       Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);
+                       model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));
+               });
+               addListener(SWT.MouseDown, this::mouseDown);
+       }
+
+       private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)
+       {
+               component.render(gc, visibleRegion);
+               if (DRAW_PINS)
+               {
+                       gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_CYAN));
+                       for (Pin p : component.getPins())
+                       {
+                               Point pos = p.getPos();
+                               gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);
+                       }
+               }
+       }
+
+       private void mouseDown(Event e)
+       {
+               if (e.button == 1)
+               {
+                       Point click = displayToWorldCoords(e.x, e.y);
+                       for (GUIComponent component : model.getComponents())
+                               if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
+                               {
+                                       redraw();
+                                       break;
+                               }
+               }
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/LogicUIStandaloneGUI.java
new file mode 100644 (file)
index 0000000..64b442e
--- /dev/null
@@ -0,0 +1,59 @@
+package net.mograsim.logic.ui;
+
+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.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+
+/**
+ * Standalone simulation visualizer graphical user interface.
+ * 
+ * @author Daniel Kirschten
+ */
+public class LogicUIStandaloneGUI
+{
+       private final Display display;
+       private final Shell shell;
+       private final LogicUICanvas ui;
+
+       public LogicUIStandaloneGUI(ViewModel 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();
+
+               // TODO don't do this here
+               LogicModelParameters params = new LogicModelParameters();
+               params.gateProcessTime = 50;
+               params.wireTravelTime = 10;
+//             timeline = ViewLogicModelAdapter.convert(model, params);
+       }
+
+       public LogicUICanvas getLogicUICanvas()
+       {
+               return ui;
+       }
+
+       /**
+        * Opens the UI shell. Returns when the shell is closed.
+        */
+       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.ui/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/SimpleLogicUIStandalone.java
new file mode 100644 (file)
index 0000000..aa1dd57
--- /dev/null
@@ -0,0 +1,38 @@
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
+
+public class SimpleLogicUIStandalone
+{
+       public static void executeVisualisation(Consumer<ViewModel> setupViewModel)
+       {
+               // setup view model
+               ViewModel viewModel = new ViewModel();
+               setupViewModel.accept(viewModel);
+
+               // convert to logic model
+               LogicModelParameters params = new LogicModelParameters();
+               params.gateProcessTime = 50;
+               params.wireTravelTime = 10;
+               Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
+
+               // initialize UI and executer
+               LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(viewModel);
+               LogicExecuter exec = new LogicExecuter(timeline);
+
+               // run it
+               exec.startLiveExecution();
+               ui.run();
+               exec.stopLiveExecution();
+       }
+
+       private SimpleLogicUIStandalone()
+       {
+               throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances");
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/RSLatchExample.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/examples/RSLatchExample.java
new file mode 100644 (file)
index 0000000..af91d1f
--- /dev/null
@@ -0,0 +1,61 @@
+package net.mograsim.logic.ui.examples;
+
+import net.mograsim.logic.ui.SimpleLogicUIStandalone;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIManualSwitch;
+import net.mograsim.logic.ui.model.components.GUINotGate;
+import net.mograsim.logic.ui.model.components.GUIOrGate;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.WireCrossPoint;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+
+public class RSLatchExample
+{
+       public static void main(String[] args)
+       {
+               SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample);
+       }
+
+       @SuppressWarnings("unused") // for GUIWires being created
+       public static void createRSLatchExample(ViewModel model)
+       {
+               GUIManualSwitch rIn = new GUIManualSwitch(model);
+               rIn.moveTo(100, 100);
+               GUIManualSwitch sIn = new GUIManualSwitch(model);
+               sIn.moveTo(100, 200);
+
+               GUIOrGate or1 = new GUIOrGate(model, 1);
+               or1.moveTo(160, 102.5);
+               new GUIWire(model, rIn.getOutputPin(), or1.getInputPins().get(0));
+
+               GUIOrGate or2 = new GUIOrGate(model, 1);
+               or2.moveTo(160, 192.5);
+               new GUIWire(model, sIn.getOutputPin(), or2.getInputPins().get(1));
+
+               GUINotGate not1 = new GUINotGate(model, 1);
+               not1.moveTo(200, 107.5);
+               new GUIWire(model, or1.getOutputPin(), not1.getInputPins().get(0));
+
+               GUINotGate not2 = new GUINotGate(model, 1);
+               not2.moveTo(200, 197.5);
+               new GUIWire(model, or2.getOutputPin(), not2.getInputPins().get(0));
+
+               WireCrossPoint p1 = new WireCrossPoint(model, 1);
+               p1.moveTo(250, 112.5);
+               new GUIWire(model, not1.getOutputPin(), p1.getPin());
+               new GUIWire(model, p1.getPin(), or2.getInputPins().get(0), new Point(250, 130), new Point(140, 185), new Point(140, 197.5));
+
+               WireCrossPoint p2 = new WireCrossPoint(model, 1);
+               p2.moveTo(250, 202.5);
+               new GUIWire(model, not2.getOutputPin(), p2.getPin());
+               new GUIWire(model, p2.getPin(), or1.getInputPins().get(1), new Point(250, 185), new Point(140, 130), new Point(140, 117.5));
+
+               WireCrossPoint o1 = new WireCrossPoint(model, 1);
+               o1.moveTo(270, 112.5);
+               new GUIWire(model, p1.getPin(), o1.getPin());
+
+               WireCrossPoint o2 = new WireCrossPoint(model, 1);
+               o2.moveTo(270, 202.5);
+               new GUIWire(model, p2.getPin(), o2.getPin());
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/ViewModel.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/ViewModel.java
new file mode 100644 (file)
index 0000000..717ee13
--- /dev/null
@@ -0,0 +1,110 @@
+package net.mograsim.logic.ui.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+
+public class ViewModel
+{
+       private final List<GUIComponent> components;
+       private final List<GUIComponent> componentsUnmodifiable;
+       private final List<GUIWire> wires;
+       private final List<GUIWire> wiresUnmodifiable;
+
+       private final List<Consumer<? super GUIComponent>> componentAddedListeners;
+       private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
+       private final List<Consumer<? super GUIWire>> wireAddedListeners;
+       private final List<Consumer<? super GUIWire>> wireRemovedListeners;
+
+       public ViewModel()
+       {
+               components = new ArrayList<>();
+               componentsUnmodifiable = Collections.unmodifiableList(components);
+               wires = new ArrayList<>();
+               wiresUnmodifiable = Collections.unmodifiableList(wires);
+
+               componentAddedListeners = new ArrayList<>();
+               componentRemovedListeners = new ArrayList<>();
+               wireAddedListeners = new ArrayList<>();
+               wireRemovedListeners = 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 GUIComponent::new.
+        */
+       public void componentCreated(GUIComponent component)
+       {
+               if (components.contains(component))
+                       throw new IllegalStateException("Don't add the same component twice!");
+               components.add(component);
+               callComponentAddedListeners(component);
+       }
+
+       /**
+        * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
+        * application code as it is automatically called in GUIComponent::destroy.
+        */
+       public void componentDestroyed(GUIComponent component)
+       {
+               if (!components.contains(component))
+                       throw new IllegalStateException("Don't remove the same component twice!");
+               components.remove(component);
+               callComponentRemovedListeners(component);
+       }
+
+       /**
+        * 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 GUIComponent::new.
+        */
+       public void wireCreated(GUIWire wire)
+       {
+               if (wires.contains(wire))
+                       throw new IllegalStateException("Don't add the same wire twice!");
+               wires.add(wire);
+               callWireAddedListeners(wire);
+       }
+
+       /**
+        * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
+        * application code as it is automatically called in GUIComponent::destroy.
+        */
+       public void wireDestroyed(GUIWire wire)
+       {
+               if (!wires.contains(wire))
+                       throw new IllegalStateException("Don't remove the same wire twice!");
+               wires.remove(wire);
+               callWireRemovedListeners(wire);
+       }
+
+       public List<GUIComponent> getComponents()
+       {
+               return componentsUnmodifiable;
+       }
+
+       public List<GUIWire> getWires()
+       {
+               return wiresUnmodifiable;
+       }
+
+       // @formatter:off
+       public void addComponentAddedListener     (Consumer<? super GUIComponent> listener){componentAddedListeners  .add   (listener);}
+       public void addComponentRemovedListener   (Consumer<? super GUIComponent> listener){componentRemovedListeners.add   (listener);}
+       public void addWireAddedListener          (Consumer<? super GUIWire     > listener){wireAddedListeners       .add   (listener);}
+       public void addWireRemovedListener        (Consumer<? super GUIWire     > listener){wireRemovedListeners     .add   (listener);}
+
+       public void removeComponentAddedListener  (Consumer<? super GUIComponent> listener){componentAddedListeners  .remove(listener);}
+       public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener){componentRemovedListeners.remove(listener);}
+       public void removeWireAddedListener       (Consumer<? super GUIWire     > listener){wireAddedListeners       .remove(listener);}
+       public void removeWireRemovedListener     (Consumer<? super GUIWire     > listener){wireRemovedListeners     .remove(listener);}
+
+       private void callComponentAddedListeners  (GUIComponent c) {componentAddedListeners  .forEach(l -> l.accept(c));}
+       private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));}
+       private void callWireAddedListeners       (GUIWire w     ) {wireAddedListeners       .forEach(l -> l.accept(w));}
+       private void callWireRemovedListeners     (GUIWire w     ) {wireRemovedListeners     .forEach(l -> l.accept(w));}
+       // @formatter:on
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIAndGate.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIAndGate.java
new file mode 100644 (file)
index 0000000..440881d
--- /dev/null
@@ -0,0 +1,12 @@
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUIAndGate extends SimpleRectangularGUIGate
+{
+       public GUIAndGate(ViewModel model, int logicWidth)
+       {
+               super(model, logicWidth, "&", false);
+               setInputCount(2);// TODO make variable
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java
new file mode 100644 (file)
index 0000000..9cea86a
--- /dev/null
@@ -0,0 +1,119 @@
+package net.mograsim.logic.ui.model.components;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public abstract class GUIComponent
+{
+       protected final ViewModel model;
+       private final Rectangle bounds;
+       private final List<Pin> pins;
+       protected final List<Pin> pinsUnmodifiable;
+
+       private final List<Consumer<? super GUIComponent>> componentLookChangedListeners;
+       private final List<Consumer<? super GUIComponent>> componentMovedListeners;
+       private final List<Consumer<? super Pin>> pinAddedListeners;
+       private final List<Consumer<? super Pin>> pinRemovedListeners;
+
+       public GUIComponent(ViewModel model)
+       {
+               this.model = model;
+               this.bounds = new Rectangle(0, 0, 0, 0);
+               this.pins = new ArrayList<>();
+               this.pinsUnmodifiable = Collections.unmodifiableList(pins);
+
+               this.componentLookChangedListeners = new ArrayList<>();
+               this.componentMovedListeners = new ArrayList<>();
+               this.pinAddedListeners = new ArrayList<>();
+               this.pinRemovedListeners = new ArrayList<>();
+
+               model.componentCreated(this);
+       }
+
+       public void destroy()
+       {
+               pins.forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
+               model.componentDestroyed(this);
+       }
+
+       public void moveTo(double x, double y)
+       {
+               bounds.x = x;
+               bounds.y = y;
+               callComponentMovedListeners();
+       }
+
+       /**
+        * Returns the bounds of this component. Used for calculating which component is clicked.
+        */
+       public Rectangle getBounds()
+       {
+               return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
+       }
+
+       /**
+        * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this
+        * click.
+        */
+       @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden
+       public boolean clicked(double x, double y)
+       {
+               return false;
+       }
+
+       /**
+        * Returns a list of pins of this component.
+        */
+       public List<Pin> getPins()
+       {
+               return pinsUnmodifiable;
+       }
+
+       // @formatter:off
+       public void addComponentLookChangedListener   (Consumer<? super GUIComponent> listener) {componentLookChangedListeners.add   (listener);}
+       public void addComponentMovedListener         (Consumer<? super GUIComponent> listener) {componentMovedListeners      .add   (listener);}
+       public void addPinAddedListener               (Consumer<? super Pin         > listener) {pinAddedListeners            .add   (listener);}
+       public void addPinRemovedListener             (Consumer<? super Pin         > listener) {pinRemovedListeners          .add   (listener);}
+                                                  
+       public void removeComponentLookChangedListener(Consumer<? super GUIComponent> listener) {componentLookChangedListeners.remove(listener);}
+       public void removeComponentMovedListener      (Consumer<? super GUIComponent> listener) {componentMovedListeners      .remove(listener);}
+       public void removePinAddedListener            (Consumer<? super Pin         > listener) {pinAddedListeners            .remove(listener);}
+       public void removePinRemovedListener          (Consumer<? super Pin         > listener) {pinRemovedListeners          .remove(listener);}
+
+       protected void callComponentLookChangedListeners(     ) {componentLookChangedListeners.forEach(l -> l.accept(this));}
+       private   void callComponentMovedListeners      (     ) {componentMovedListeners      .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   ));}
+       // @form  atter:on
+
+       /**
+        * Render this component to the given gc.
+        */
+       public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+
+       protected void setSize(double width, double height)
+       {
+               bounds.width = width;
+               bounds.height = height;
+               callComponentLookChangedListeners();
+       }
+
+       protected void addPin(Pin pin)
+       {
+               pins.add(pin);
+               callPinAddedListeners(pin);
+       }
+
+       protected void removePin(Pin pin)
+       {
+               pins.remove(pin);
+               callPinRemovedListeners(pin);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java
new file mode 100644 (file)
index 0000000..8ca57ee
--- /dev/null
@@ -0,0 +1,67 @@
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.Pin;
+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.components.ManualSwitch;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class GUIManualSwitch extends GUIComponent
+{
+       private static final double width = 20;
+       private static final double height = 15;
+       private static final double fontHeight = 5;
+
+       private final Pin outputPin;
+
+       private ManualSwitch logicSwitch;
+       private ReadEnd end;
+
+       public GUIManualSwitch(ViewModel model)
+       {
+               super(model);
+               setSize(width, height);
+               addPin(this.outputPin = new Pin(this, 1, width, height / 2));
+       }
+
+       @Override
+       public void render(GeneralGC gc, Rectangle visibleRegion)
+       {
+               double posX = getBounds().x;
+               double posY = getBounds().y;
+
+               gc.drawRectangle(posX, posY, width, height);
+               String label = BitVectorFormatter.formatValueAsString(end);
+               Font oldFont = gc.getFont();
+               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
+               gc.setFont(labelFont);
+               Point textExtent = gc.textExtent(label);
+               gc.drawText(label, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
+               gc.setFont(oldFont);
+       }
+
+       public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
+       {
+               this.logicSwitch = logicSwitch;
+               this.end = end;
+               // TODO when ManualSwitch supports it, add listeners
+               end.addObserver((i, o) -> callComponentLookChangedListeners());
+       }
+
+       @Override
+       public boolean clicked(double x, double y)
+       {
+               if (logicSwitch != null)
+                       logicSwitch.toggle();
+               return true;
+       }
+
+       public Pin getOutputPin()
+       {
+               return outputPin;
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUINotGate.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUINotGate.java
new file mode 100644 (file)
index 0000000..01df349
--- /dev/null
@@ -0,0 +1,12 @@
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUINotGate extends SimpleRectangularGUIGate
+{
+       public GUINotGate(ViewModel model, int logicWidth)
+       {
+               super(model, logicWidth, "1", true);
+               setInputCount(1);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIOrGate.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIOrGate.java
new file mode 100644 (file)
index 0000000..bbc436d
--- /dev/null
@@ -0,0 +1,12 @@
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUIOrGate extends SimpleRectangularGUIGate
+{
+       public GUIOrGate(ViewModel model, int logicWidth)
+       {
+               super(model, logicWidth, "\u22651", false);// ">=1"
+               setInputCount(2);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularGUIGate.java
new file mode 100644 (file)
index 0000000..a2875c6
--- /dev/null
@@ -0,0 +1,89 @@
+package net.mograsim.logic.ui.model.components;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.MovablePin;
+import net.mograsim.logic.ui.model.wires.Pin;
+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;
+
+public class SimpleRectangularGUIGate extends GUIComponent
+{
+       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 label;
+       protected final int logicWidth;
+       private final boolean isInverted;
+       private final double rectWidth;
+
+       private MovablePin outputPin;
+       private final List<Pin> inputPins;
+       private final List<Pin> inputPinsUnmodifiable;
+
+       protected SimpleRectangularGUIGate(ViewModel model, int logicWidth, String label, boolean isInverted)
+       {
+               super(model);
+               this.label = label;
+               this.logicWidth = logicWidth;
+               this.isInverted = isInverted;
+               this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
+               this.outputPin = new MovablePin(this, logicWidth, width, 0);
+               addPin(outputPin);
+               this.inputPins = new ArrayList<>();
+               this.inputPinsUnmodifiable = Collections.unmodifiableList(inputPins);
+               setInputCount(1);
+       }
+
+       protected void setInputCount(int inputCount)
+       {
+               int oldInputCount = inputPins.size();
+               setSize(width, inputCount * pinDistance);
+               if (oldInputCount > inputCount)
+                       while (inputPins.size() > inputCount)
+                               removePin(inputPins.get(inputCount));
+               else if (oldInputCount < inputCount)
+                       for (int i = oldInputCount; i < inputCount; i++)
+                       {
+                               Pin pin = new Pin(this, logicWidth, 0, pinDistance / 2 + i * pinDistance);
+                               inputPins.add(pin);
+                               addPin(pin);
+                       }
+               outputPin.setRelPos(width, inputCount * pinDistance / 2);
+       }
+
+       public Pin getOutputPin()
+       {
+               return outputPin;
+       }
+
+       public List<Pin> getInputPins()
+       {
+               return inputPinsUnmodifiable;
+       }
+
+       @Override
+       public void render(GeneralGC gc, Rectangle visibleRegion)
+       {
+               double posX = getBounds().x;
+               double posY = getBounds().y;
+
+               double height = inputPins.size() * pinDistance;
+               gc.drawRectangle(posX, posY, rectWidth, height);
+               Font oldFont = gc.getFont();
+               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
+               gc.setFont(labelFont);
+               Point textExtent = gc.textExtent(label);
+               gc.drawText(label, posX + (rectWidth - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
+               gc.setFont(oldFont);
+               if (isInverted)
+                       gc.drawOval(posX + rectWidth, posY + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java
new file mode 100644 (file)
index 0000000..736c0ea
--- /dev/null
@@ -0,0 +1,100 @@
+package net.mograsim.logic.ui.model.wires;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.ColorHelper;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class GUIWire
+{
+       private final ViewModel model;
+       public final int logicWidth;
+       private Pin pin1;
+       private Pin pin2;
+       private double[] path;
+
+       private final List<Consumer<? super GUIWire>> wireLookChangedListeners;
+
+       private ReadEnd end;
+
+       public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
+       {
+               this.model = model;
+               this.logicWidth = pin1.logicWidth;
+               if (pin2.logicWidth != pin1.logicWidth)
+                       throw new IllegalArgumentException("Can't connect pins of different logic width");
+               this.path = new double[path.length * 2 + 4];
+               for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)
+               {
+                       this.path[dstI + 0] = path[srcI].x;
+                       this.path[dstI + 1] = path[srcI].y;
+               }
+
+               this.pin1 = pin1;
+               this.pin2 = pin2;
+
+               wireLookChangedListeners = new ArrayList<>();
+
+               pin1.addPinMovedListener(p -> pin1Moved());
+               pin2.addPinMovedListener(p -> pin2Moved());
+               pin1Moved();
+               pin2Moved();
+
+               model.wireCreated(this);
+       }
+
+       private void pin1Moved()
+       {
+               Point pos = pin1.getPos();
+               this.path[0] = pos.x;
+               this.path[1] = pos.y;
+       }
+
+       private void pin2Moved()
+       {
+               Point pos = pin2.getPos();
+               this.path[this.path.length - 2] = pos.x;
+               this.path[this.path.length - 1] = pos.y;
+       }
+
+       public void destroy()
+       {
+               model.wireDestroyed(this);
+       }
+
+       public void render(GeneralGC gc)
+       {
+               ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
+       }
+
+       public void setLogicModelBinding(ReadEnd end)
+       {
+               this.end = end;
+               end.addObserver((i, o) -> callWireLookChangedListeners());
+       }
+
+       public Pin getPin1()
+       {
+               return pin1;
+       }
+
+       public Pin getPin2()
+       {
+               return pin2;
+       }
+
+       // @formatter:off
+       public void addWireLookChangedListener   (Consumer<? super GUIWire> listener) {wireLookChangedListeners.add   (listener);}
+
+       public void removeWireLookChangedListener(Consumer<? super GUIWire> listener) {wireLookChangedListeners.remove(listener);}
+
+       private void callWireLookChangedListeners() {wireLookChangedListeners.forEach(l -> l.accept(this));}
+       // @formatter:on
+
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/MovablePin.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/MovablePin.java
new file mode 100644 (file)
index 0000000..669bb1b
--- /dev/null
@@ -0,0 +1,17 @@
+package net.mograsim.logic.ui.model.wires;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+
+public class MovablePin extends Pin
+{
+       public MovablePin(GUIComponent component, int logicWidth, double relX, double relY)
+       {
+               super(component, logicWidth, 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.ui/src/net/mograsim/logic/ui/model/wires/Pin.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/Pin.java
new file mode 100644 (file)
index 0000000..f3a7802
--- /dev/null
@@ -0,0 +1,68 @@
+package net.mograsim.logic.ui.model.wires;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class Pin
+{
+       public final GUIComponent component;
+       public final int logicWidth;
+
+       protected double relX;
+       protected double relY;
+
+       private final List<Consumer<? super Pin>> pinMovedListeners;
+
+       public Pin(GUIComponent component, int logicWidth, double relX, double relY)
+       {
+               this.component = component;
+               this.logicWidth = logicWidth;
+               this.relX = relX;
+               this.relY = relY;
+
+               this.pinMovedListeners = new ArrayList<>();
+
+               component.addComponentMovedListener(c -> callPinMovedListeners());
+       }
+
+       public double getRelX()
+       {
+               return relX;
+       }
+
+       public double getRelY()
+       {
+               return relY;
+       }
+
+       public Point getRelPos()
+       {
+               return new Point(relX, relY);
+       }
+
+       public Point getPos()
+       {
+               Rectangle componentBounds = component.getBounds();
+               return new Point(relX + componentBounds.x, relY + componentBounds.y);
+       }
+
+       // @formatter:off
+       public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
+
+       public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
+
+       private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
+       // @formatter:on
+
+       protected void setRelPos(double relX, double relY)
+       {
+               this.relX = relX;
+               this.relY = relY;
+               callPinMovedListeners();
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/WireCrossPoint.java
new file mode 100644 (file)
index 0000000..0949ffb
--- /dev/null
@@ -0,0 +1,49 @@
+package net.mograsim.logic.ui.model.wires;
+
+import net.mograsim.logic.ui.ColorHelper;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+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.Wire.ReadEnd;
+
+public class WireCrossPoint extends GUIComponent
+{
+       private final Pin pin;
+
+       private ReadEnd end;
+       private final int logicWidth;
+
+       public WireCrossPoint(ViewModel model, int logicWidth)
+       {
+               super(model);
+               this.logicWidth = logicWidth;
+               setSize(0, 0);
+               addPin(this.pin = new Pin(this, logicWidth, 0, 0));
+       }
+
+       @Override
+       public void render(GeneralGC gc, Rectangle visibleRegion)
+       {
+               Rectangle bounds = getBounds();
+               ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
+                               () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
+       }
+
+       public void setLogicModelBinding(ReadEnd end)
+       {
+               this.end = end;
+               end.addObserver((i, o) -> callComponentLookChangedListeners());
+       }
+
+       public int getLogicWidth()
+       {
+               return logicWidth;
+       }
+
+       public Pin getPin()
+       {
+               return pin;
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/LogicModelParameters.java
new file mode 100644 (file)
index 0000000..d75cb1b
--- /dev/null
@@ -0,0 +1,7 @@
+package net.mograsim.logic.ui.modeladapter;
+
+public class LogicModelParameters
+{
+       public int wireTravelTime;
+       public int gateProcessTime;
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java
new file mode 100644 (file)
index 0000000..6f4e7b7
--- /dev/null
@@ -0,0 +1,146 @@
+package net.mograsim.logic.ui.modeladapter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+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.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIAndGate;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.components.GUINotGate;
+import net.mograsim.logic.ui.model.components.GUIOrGate;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.model.wires.WireCrossPoint;
+import net.mograsim.logic.ui.modeladapter.componentadapters.ComponentAdapter;
+import net.mograsim.logic.ui.modeladapter.componentadapters.ManualSwitchAdapter;
+import net.mograsim.logic.ui.modeladapter.componentadapters.SimpleGateAdapter;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.components.gates.AndGate;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class ViewLogicModelAdapter
+{
+       private final static Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdapters;
+       static
+       {
+               Set<ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashSet<>();
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new));
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new));
+               componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o)));
+               componentAdaptersModifiable.add(new ManualSwitchAdapter());
+               // TODO list all "primitive" adapters here
+               componentAdapters = Collections.unmodifiableMap(
+                               componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity())));
+       }
+
+       public static Timeline convert(ViewModel viewModel, LogicModelParameters params)
+       {
+               // TODO replace Timeline with LogicModel as soon as it exists
+               Timeline timeline = new Timeline(10);
+
+               Map<Pin, Wire> logicWiresPerPin = convertWires(
+                               viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()),
+                               viewModel.getWires(), params, timeline);
+               Map<Pin, Wire> logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin);
+
+               Map<GUIComponent, Component> oneToOneComponents = new HashMap<>();
+               for (GUIComponent guiComp : viewModel.getComponents())
+               {
+                       if (!(guiComp instanceof WireCrossPoint))
+                               oneToOneComponents.put(guiComp, createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable,
+                                               componentAdapters.get(guiComp.getClass())));
+                       else
+                       {
+                               WireCrossPoint guiCompCasted = (WireCrossPoint) guiComp;
+                               guiCompCasted.setLogicModelBinding(logicWiresPerPin.get(guiCompCasted.getPin()).createReadOnlyEnd());
+                       }
+               }
+
+               // TODO handle complex components
+
+               List<Component> logicComponents = new ArrayList<>();
+               logicComponents.addAll(oneToOneComponents.values());
+
+               return timeline;
+       }
+
+       private static Map<Pin, Wire> convertWires(Set<Pin> allPins, List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
+       {
+               Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(allPins, wires);
+               Map<Pin, Wire> logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups);
+               setGUIWiresLogicModelBinding(wires, logicWiresPerPin);
+               return logicWiresPerPin;
+       }
+
+       private static Map<Pin, Wire> createLogicWires(LogicModelParameters params, Timeline timeline, Map<Pin, Set<Pin>> connectedPinGroups)
+       {
+               Map<Pin, Wire> logicWiresPerPin = new HashMap<>();
+               Map<Set<Pin>, Wire> logicWiresPerPinGroup = new HashMap<>();
+               for (Entry<Pin, Set<Pin>> e : connectedPinGroups.entrySet())
+                       logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(),
+                                       set -> new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime)));
+               return logicWiresPerPin;
+       }
+
+       private static void setGUIWiresLogicModelBinding(List<GUIWire> wires, Map<Pin, Wire> logicWiresPerPin)
+       {
+               Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct()
+                               .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd));
+               for (GUIWire guiWire : wires)
+                       guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1())));
+       }
+
+       private static Map<Pin, Set<Pin>> getConnectedPinGroups(Set<Pin> allPins, List<GUIWire> wires)
+       {
+               Map<Pin, Set<Pin>> connectedPinsPerPin = new HashMap<>();
+
+               for (Pin p : allPins)
+               {
+                       HashSet<Pin> connectedPins = new HashSet<>();
+                       connectedPins.add(p);
+                       connectedPinsPerPin.put(p, connectedPins);
+               }
+
+               wires.forEach(wire ->
+               {
+                       Pin pin1 = wire.getPin1();
+                       Pin pin2 = wire.getPin2();
+
+                       Set<Pin> pin1ConnectedPins = connectedPinsPerPin.get(pin1);
+                       Set<Pin> 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 <G extends GUIComponent> Component createAndLinkComponent(Timeline timeline, LogicModelParameters params,
+                       GUIComponent guiComponent, Map<Pin, Wire> logicWiresPerPin, ComponentAdapter<G> adapter)
+       {
+               if (adapter == null)
+                       throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass());
+               return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin);
+       }
+
+       private ViewLogicModelAdapter()
+       {
+               throw new UnsupportedOperationException("No ViewLogicModelConverter instances");
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ComponentAdapter.java
new file mode 100644 (file)
index 0000000..0dd563e
--- /dev/null
@@ -0,0 +1,18 @@
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+
+public interface ComponentAdapter<G extends GUIComponent>
+{
+       public Class<G> getSupportedClass();
+
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent,
+                       Map<Pin, Wire> logicWiresPerPin);
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/ManualSwitchAdapter.java
new file mode 100644 (file)
index 0000000..197cf74
--- /dev/null
@@ -0,0 +1,31 @@
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.GUIManualSwitch;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.components.ManualSwitch;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class ManualSwitchAdapter implements ComponentAdapter<GUIManualSwitch>
+{
+       @Override
+       public Class<GUIManualSwitch> getSupportedClass()
+       {
+               return GUIManualSwitch.class;
+       }
+
+       @Override
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIManualSwitch guiComponent,
+                       Map<Pin, Wire> logicWiresPerPin)
+       {
+               ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+               ManualSwitch manualSwitch = new ManualSwitch(timeline, end);
+               guiComponent.setLogicModelBinding(manualSwitch, end);
+               return manualSwitch;
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/componentadapters/SimpleGateAdapter.java
new file mode 100644 (file)
index 0000000..1902d62
--- /dev/null
@@ -0,0 +1,48 @@
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.List;
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.SimpleRectangularGUIGate;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class SimpleGateAdapter<G extends SimpleRectangularGUIGate> implements ComponentAdapter<G>
+{
+       private final Class<G> supportedClass;
+       private final ComponentConstructor constructor;
+
+       public SimpleGateAdapter(Class<G> supportedClass, ComponentConstructor constructor)
+       {
+               this.supportedClass = supportedClass;
+               this.constructor = constructor;
+       }
+
+       @Override
+       public Class<G> getSupportedClass()
+       {
+               return supportedClass;
+       }
+
+       @Override
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent, Map<Pin, Wire> logicWiresPerPin)
+       {
+               ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+               List<Pin> inputPins = guiComponent.getInputPins();
+               ReadEnd[] ins = new ReadEnd[inputPins.size()];
+               for (int i = 0; i < inputPins.size(); i++)
+                       ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
+               return constructor.newComponent(timeline, params.gateProcessTime, out, ins);
+       }
+
+       public static interface ComponentConstructor
+       {
+               public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
+       }
+
+}
\ No newline at end of file
diff --git a/net.mograsim.rcp/.classpath b/net.mograsim.rcp/.classpath
new file mode 100644 (file)
index 0000000..c34bb53
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+               <attributes>
+                       <attribute name="module" value="true"/>
+               </attributes>
+       </classpathentry>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/net.mograsim.rcp/.gitignore b/net.mograsim.rcp/.gitignore
new file mode 100644 (file)
index 0000000..65776c3
--- /dev/null
@@ -0,0 +1 @@
+/bin/
\ No newline at end of file
diff --git a/net.mograsim.rcp/.project b/net.mograsim.rcp/.project
new file mode 100644 (file)
index 0000000..52ed088
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>net.mograsim.rcp</name>
+       <comment></comment>
+       <projects>
+               <project>net.mograsim.rcp</project>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+       </natures>
+</projectDescription>
diff --git a/net.mograsim.rcp/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.rcp/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..132b498
--- /dev/null
@@ -0,0 +1,465 @@
+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=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+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=1.8
+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_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=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_switch_case_expressions=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_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=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_switch_case_expressions=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.rcp/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.rcp/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644 (file)
index 0000000..5ae94b6
--- /dev/null
@@ -0,0 +1,64 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_MoGraSim
+formatter_settings_version=16
+org.eclipse.jdt.ui.text.custom_code_templates=
+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.rcp/.settings/org.eclipse.ltk.core.refactoring.prefs b/net.mograsim.rcp/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644 (file)
index 0000000..b196c64
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/net.mograsim.rcp/.settings/org.eclipse.pde.prefs b/net.mograsim.rcp/.settings/org.eclipse.pde.prefs
new file mode 100644 (file)
index 0000000..90e8aa1
--- /dev/null
@@ -0,0 +1,34 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=1
+compilers.p.build.java.compiler=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/net.mograsim.rcp/.settings/org.eclipse.wst.sse.core.prefs b/net.mograsim.rcp/.settings/org.eclipse.wst.sse.core.prefs
new file mode 100644 (file)
index 0000000..e6c26be
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+task-tags/use-project-settings=true
diff --git a/net.mograsim.rcp/.settings/org.sonarlint.eclipse.core.prefs b/net.mograsim.rcp/.settings/org.sonarlint.eclipse.core.prefs
new file mode 100644 (file)
index 0000000..76926ab
--- /dev/null
@@ -0,0 +1,4 @@
+autoEnabled=true
+eclipse.preferences.version=1
+extraProperties=
+fileExclusions=
diff --git a/net.mograsim.rcp/Application.e4xmi b/net.mograsim.rcp/Application.e4xmi
new file mode 100644 (file)
index 0000000..3caa9c1
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_6wlLcMgZEeSyMNYR5xypkQ" elementId="Sample.application" bindingContexts="_6wlLecgZEeSyMNYR5xypkQ">
+  <children xsi:type="basic:TrimmedWindow" xmi:id="_6wlLccgZEeSyMNYR5xypkQ" elementId="Sample.window.main" label="Sample RCP4" iconURI="platform:/plugin/net.mograsim.rcp/icons/app/ico_16t.png" width="500" height="400">
+    <children xsi:type="basic:PartSashContainer" xmi:id="_6wlLksgZEeSyMNYR5xypkQ" elementId="Sample.partsashcontainer.sample">
+      <children xsi:type="basic:PartStack" xmi:id="_6wlLk8gZEeSyMNYR5xypkQ" elementId="Sample.partstack.sample">
+        <children xsi:type="basic:Part" xmi:id="_6wlLlMgZEeSyMNYR5xypkQ" elementId="Sample.part.sample" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.SamplePart" label="Sample Part" iconURI="platform:/plugin/net.mograsim.rcp/icons/home.png"/>
+        <children xsi:type="basic:Part" xmi:id="_cldhcH1HEema06ZDPR6BSw" elementId="net.mograsim.rcp.part.logicui" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.LogicUIPart" label="LogicUI part"/>
+      </children>
+      <children xsi:type="basic:PartStack" xmi:id="_l2EzYG6wEemo__tDmTCqCQ" elementId="sample.partstack.0">
+        <children xsi:type="basic:Part" xmi:id="_mW1XEG6wEemo__tDmTCqCQ" elementId="sample.part.none" label="None" tooltip="Something"/>
+      </children>
+    </children>
+    <mainMenu xmi:id="_6wlLicgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.menu">
+      <children xsi:type="menu:Menu" xmi:id="_6wlLisgZEeSyMNYR5xypkQ" elementId="file" label="File">
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLi8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.file.open" label="Open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.save" label="Save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjcgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.quit" label="Quit" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+      </children>
+      <children xsi:type="menu:Menu" xmi:id="_6wlLjsgZEeSyMNYR5xypkQ" elementId="help" label="Help">
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLj8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.about" label="About" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+      </children>
+    </mainMenu>
+    <trimBars xmi:id="_6wlLlcgZEeSyMNYR5xypkQ" elementId="Sample.trimbar.top">
+      <children xsi:type="menu:ToolBar" xmi:id="_6wlLlsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.toolbar">
+        <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLmMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+        <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLl8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+      </children>
+    </trimBars>
+  </children>
+  <handlers xmi:id="_6wlLfcgZEeSyMNYR5xypkQ" elementId="sample.handler.quitCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.QuitHandler" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+  <handlers xmi:id="_6wlLgcgZEeSyMNYR5xypkQ" elementId="sample.handler.openCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.OpenHandler" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+  <handlers xmi:id="_6wlLhMgZEeSyMNYR5xypkQ" elementId="sample.handler.saveCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.SaveHandler" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+  <handlers xmi:id="_6wlLh8gZEeSyMNYR5xypkQ" elementId="sample.handler.aboutCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.AboutHandler" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+  <bindingTables xmi:id="_6wlLfsgZEeSyMNYR5xypkQ" elementId="Sample.bindingtable" bindingContext="_6wlLecgZEeSyMNYR5xypkQ">
+    <bindings xmi:id="_6wlLf8gZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1q" keySequence="M1+Q" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+    <bindings xmi:id="_6wlLgsgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1o" keySequence="M1+O" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+    <bindings xmi:id="_6wlLhcgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1s" keySequence="M1+S" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+    <bindings xmi:id="_6wlLiMgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1a" keySequence="M1+A" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+  </bindingTables>
+  <rootContext xmi:id="_6wlLecgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_6wlLesgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_6wlLe8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <commands xmi:id="_6wlLfMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>
+  <commands xmi:id="_6wlLgMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.open" commandName="openCommand"/>
+  <commands xmi:id="_6wlLg8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>
+  <commands xmi:id="_6wlLhsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>
+  <addons xmi:id="_6wlLcsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+  <addons xmi:id="_6wlLc8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+  <addons xmi:id="_6wlLdMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
+  <addons xmi:id="_6wlLdcgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
+  <addons xmi:id="_6wlLdsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.handler.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
+  <addons xmi:id="_6wlLd8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
+  <addons xmi:id="_6wlLeMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
+</application:Application>
diff --git a/net.mograsim.rcp/LICENSE b/net.mograsim.rcp/LICENSE
new file mode 100644 (file)
index 0000000..d3087e4
--- /dev/null
@@ -0,0 +1,277 @@
+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.
diff --git a/net.mograsim.rcp/META-INF/MANIFEST.MF b/net.mograsim.rcp/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..1c5e2a7
--- /dev/null
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: net.mograsim.rcp;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.200",
+ org.eclipse.e4.ui.model.workbench;bundle-version="2.1.300",
+ org.eclipse.jface;bundle-version="3.15.100",
+ org.eclipse.e4.ui.workbench;bundle-version="1.9.0",
+ org.eclipse.e4.core.di;bundle-version="1.7.100",
+ org.eclipse.e4.ui.di;bundle-version="1.2.500",
+ org.eclipse.ui.workbench;bundle-version="3.113.0",
+ javax.annotation;bundle-version="1.2.0",
+ net.mograsim.logic.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: Sample
+Export-Package: net.mograsim.rcp.handlers;uses:="org.eclipse.swt.widgets,org.eclipse.e4.ui.workbench,org.eclipse.e4.ui.workbench.modeling",
+ net.mograsim.rcp.parts;uses:="org.eclipse.swt.widgets",
+ net.mograsim.rcp.splashhandlers
diff --git a/net.mograsim.rcp/OSGI-INF/l10n/bundle.properties b/net.mograsim.rcp/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..e07734a
--- /dev/null
@@ -0,0 +1,6 @@
+#Properties file for Sample
+Bundle-Vendor = MYSELF
+Bundle-Name = Sample
+product.name = Sample
+extension-point.name = Splash Extensions
+product.name.0 = Simulator WIP
\ No newline at end of file
diff --git a/net.mograsim.rcp/build.properties b/net.mograsim.rcp/build.properties
new file mode 100644 (file)
index 0000000..d1ae984
--- /dev/null
@@ -0,0 +1,18 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               Application.e4xmi,\
+               css/,\
+               splash.bmp,\
+               schema/,\
+               OSGI-INF/l10n/bundle.properties,\
+               OSGI-INF/
+source.. = src/
+src.includes = Application.e4xmi,\
+               OSGI-INF/l10n/bundle.properties,\
+               css/,\
+               icons/,\
+               schema/,\
+               splash.bmp
diff --git a/net.mograsim.rcp/css/default.css b/net.mograsim.rcp/css/default.css
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/net.mograsim.rcp/icons/af.png b/net.mograsim.rcp/icons/af.png
new file mode 100644 (file)
index 0000000..bcd0ce8
Binary files /dev/null and b/net.mograsim.rcp/icons/af.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_128t.png b/net.mograsim.rcp/icons/app/ico_128t.png
new file mode 100644 (file)
index 0000000..5c27fb8
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_128t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_16t.png b/net.mograsim.rcp/icons/app/ico_16t.png
new file mode 100644 (file)
index 0000000..cdca854
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_16t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_24t.png b/net.mograsim.rcp/icons/app/ico_24t.png
new file mode 100644 (file)
index 0000000..9abf17e
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_24t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_256t.icns b/net.mograsim.rcp/icons/app/ico_256t.icns
new file mode 100644 (file)
index 0000000..bcd28f2
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_256t.icns differ
diff --git a/net.mograsim.rcp/icons/app/ico_256t.png b/net.mograsim.rcp/icons/app/ico_256t.png
new file mode 100644 (file)
index 0000000..8249999
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_256t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_256t.xpm b/net.mograsim.rcp/icons/app/ico_256t.xpm
new file mode 100644 (file)
index 0000000..4e1fa7d
--- /dev/null
@@ -0,0 +1,3009 @@
+/* XPM */
+static char * C:\Users\Christian\Documents\Informatik_Studium\ico_256t_xpm[] = {
+"256 256 2750 2",
+"      c None",
+".     c #000000",
+"+     c #00100E",
+"@     c #001312",
+"#     c #001413",
+"$     c #001C1B",
+"%     c #001A19",
+"&     c #001515",
+"*     c #002120",
+"=     c #002221",
+"-     c #001918",
+";     c #002525",
+">     c #002927",
+",     c #002323",
+"'     c #000F0E",
+")     c #001C1A",
+"!     c #002726",
+"~     c #002C2B",
+"{     c #002928",
+"]     c #001110",
+"^     c #001E1C",
+"/     c #002727",
+"(     c #002D2C",
+"_     c #002B2B",
+":     c #002827",
+"<     c #001E1D",
+"[     c #001211",
+"}     c #001F1C",
+"|     c #002E2E",
+"1     c #002625",
+"2     c #001D1D",
+"3     c #002121",
+"4     c #002C2C",
+"5     c #001514",
+"6     c #002F2E",
+"7     c #002B2C",
+"8     c #002424",
+"9     c #001816",
+"0     c #002F2D",
+"a     c #00302F",
+"b     c #001A18",
+"c     c #002725",
+"d     c #002A29",
+"e     c #001B1A",
+"f     c #003130",
+"g     c #003131",
+"h     c #002F2F",
+"i     c #001F1D",
+"j     c #000D0B",
+"k     c #001615",
+"l     c #00110F",
+"m     c #001010",
+"n     c #001F1E",
+"o     c #002B2A",
+"p     c #002220",
+"q     c #002321",
+"r     c #002021",
+"s     c #00201E",
+"t     c #001D1C",
+"u     c #001D1B",
+"v     c #001917",
+"w     c #001716",
+"x     c #001313",
+"y     c #001111",
+"z     c #001F1F",
+"A     c #003333",
+"B     c #003231",
+"C     c #003332",
+"D     c #003232",
+"E     c #002020",
+"F     c #002E2C",
+"G     c #002929",
+"H     c #002524",
+"I     c #001E1E",
+"J     c #001818",
+"K     c #001717",
+"L     c #001414",
+"M     c #002E2F",
+"N     c #003233",
+"O     c #002E2D",
+"P     c #002423",
+"Q     c #00201F",
+"R     c #001A1A",
+"S     c #002F30",
+"T     c #003434",
+"U     c #002322",
+"V     c #003334",
+"W     c #002D2D",
+"X     c #002828",
+"Y     c #002324",
+"Z     c #002222",
+"`     c #001817",
+" .    c #003635",
+"..    c #003535",
+"+.    c #003534",
+"@.    c #003636",
+"#.    c #003433",
+"$.    c #002D2E",
+"%.    c #003533",
+"&.    c #003837",
+"*.    c #003736",
+"=.    c #003836",
+"-.    c #003735",
+";.    c #003432",
+">.    c #002C2A",
+",.    c #002422",
+"'.    c #002320",
+").    c #001C1C",
+"!.    c #003331",
+"~.    c #002A28",
+"{.    c #002624",
+"].    c #003737",
+"^.    c #002D2B",
+"/.    c #003839",
+"(.    c #003838",
+"_.    c #003939",
+":.    c #003230",
+"<.    c #002B29",
+"[.    c #003637",
+"}.    c #000C0B",
+"|.    c #001412",
+"1.    c #00393A",
+"2.    c #003A3A",
+"3.    c #002626",
+"4.    c #001715",
+"5.    c #002523",
+"6.    c #003A3B",
+"7.    c #003536",
+"8.    c #003A39",
+"9.    c #00302E",
+"0.    c #003C3C",
+"a.    c #003B3C",
+"b.    c #003B3B",
+"c.    c #003B3A",
+"d.    c #003A3C",
+"e.    c #003738",
+"f.    c #003030",
+"g.    c #00292A",
+"h.    c #001919",
+"i.    c #001614",
+"j.    c #002A2A",
+"k.    c #003C3D",
+"l.    c #003B3D",
+"m.    c #003D3D",
+"n.    c #003132",
+"o.    c #003537",
+"p.    c #003C3E",
+"q.    c #003D3C",
+"r.    c #003E3E",
+"s.    c #003E3D",
+"t.    c #003F3F",
+"u.    c #003F3E",
+"v.    c #003E3F",
+"w.    c #003C3B",
+"x.    c #003938",
+"y.    c #003D3F",
+"z.    c #004041",
+"A.    c #004040",
+"B.    c #003F40",
+"C.    c #003F41",
+"D.    c #003E40",
+"E.    c #004042",
+"F.    c #00403F",
+"G.    c #004141",
+"H.    c #004142",
+"I.    c #004241",
+"J.    c #003031",
+"K.    c #004242",
+"L.    c #003634",
+"M.    c #004140",
+"N.    c #004243",
+"O.    c #004344",
+"P.    c #004345",
+"Q.    c #004445",
+"R.    c #004244",
+"S.    c #004343",
+"T.    c #004444",
+"U.    c #002C2D",
+"V.    c #00383A",
+"W.    c #004546",
+"X.    c #004446",
+"Y.    c #004245",
+"Z.    c #004646",
+"`.    c #004143",
+" +    c #004545",
+".+    c #004647",
+"++    c #004747",
+"@+    c #004447",
+"#+    c #004547",
+"$+    c #004746",
+"%+    c #004748",
+"&+    c #00484A",
+"*+    c #004849",
+"=+    c #00474A",
+"-+    c #00484B",
+";+    c #004749",
+">+    c #004848",
+",+    c #004A4C",
+"'+    c #00494C",
+")+    c #004B4C",
+"!+    c #00494B",
+"~+    c #00494A",
+"{+    c #004A4B",
+"]+    c #004C4C",
+"^+    c #004949",
+"/+    c #004B4B",
+"(+    c #004C4D",
+"_+    c #004C4B",
+":+    c #004D4D",
+"<+    c #004D4E",
+"[+    c #004E4F",
+"}+    c #004D4F",
+"|+    c #004E4E",
+"1+    c #004C4E",
+"2+    c #004645",
+"3+    c #004E50",
+"4+    c #004F4F",
+"5+    c #004F50",
+"6+    c #004649",
+"7+    c #005052",
+"8+    c #005051",
+"9+    c #004F51",
+"0+    c #005053",
+"a+    c #005153",
+"b+    c #003D3E",
+"c+    c #005254",
+"d+    c #004B4D",
+"e+    c #005253",
+"f+    c #005152",
+"g+    c #005355",
+"h+    c #005255",
+"i+    c #005154",
+"j+    c #005356",
+"k+    c #005354",
+"l+    c #005456",
+"m+    c #005050",
+"n+    c #005455",
+"o+    c #005457",
+"p+    c #005557",
+"q+    c #005556",
+"r+    c #005658",
+"s+    c #005659",
+"t+    c #004A4A",
+"u+    c #005759",
+"v+    c #005558",
+"w+    c #004648",
+"x+    c #00575A",
+"y+    c #00585A",
+"z+    c #005859",
+"A+    c #00585B",
+"B+    c #004C4F",
+"C+    c #00595C",
+"D+    c #005A5D",
+"E+    c #005A5C",
+"F+    c #00595B",
+"G+    c #00595D",
+"H+    c #005B5D",
+"I+    c #00585C",
+"J+    c #005A5B",
+"K+    c #004D50",
+"L+    c #005B5E",
+"M+    c #005C5E",
+"N+    c #005C5F",
+"O+    c #005C5D",
+"P+    c #005B5F",
+"Q+    c #005D5E",
+"R+    c #005E60",
+"S+    c #005D5F",
+"T+    c #005E5F",
+"U+    c #005B5C",
+"V+    c #005151",
+"W+    c #005F60",
+"X+    c #004342",
+"Y+    c #005657",
+"Z+    c #005F62",
+"`+    c #005F63",
+" @    c #005E61",
+".@    c #005758",
+"+@    c #005D62",
+"@@    c #005D60",
+"#@    c #005C60",
+"$@    c #005E62",
+"%@    c #006063",
+"&@    c #005F61",
+"*@    c #006164",
+"=@    c #006364",
+"-@    c #006264",
+";@    c #006265",
+">@    c #006163",
+",@    c #006365",
+"'@    c #006465",
+")@    c #006466",
+"!@    c #006162",
+"~@    c #006064",
+"{@    c #006366",
+"]@    c #006367",
+"^@    c #006062",
+"/@    c #006567",
+"(@    c #00595A",
+"_@    c #006568",
+":@    c #006467",
+"<@    c #006566",
+"[@    c #006267",
+"}@    c #006165",
+"|@    c #006569",
+"1@    c #006469",
+"2@    c #004346",
+"3@    c #004A4D",
+"4@    c #006468",
+"5@    c #006769",
+"6@    c #006669",
+"7@    c #00676A",
+"8@    c #006668",
+"9@    c #005E63",
+"0@    c #00666A",
+"a@    c #003A38",
+"b@    c #006667",
+"c@    c #005D61",
+"d@    c #00686B",
+"e@    c #00676B",
+"f@    c #00686A",
+"g@    c #2A5B5C",
+"h@    c #00686C",
+"i@    c #00696C",
+"j@    c #00676C",
+"k@    c #004548",
+"l@    c #00696B",
+"m@    c #00666B",
+"n@    c #006B6D",
+"o@    c #006A6D",
+"p@    c #006A6C",
+"q@    c #005458",
+"r@    c #00696A",
+"s@    c #00696D",
+"t@    c #006A6E",
+"u@    c #006C6D",
+"v@    c #006B6E",
+"w@    c #005252",
+"x@    c #006C6E",
+"y@    c #006B6F",
+"z@    c #006C6F",
+"A@    c #006E71",
+"B@    c #006D6F",
+"C@    c #006E70",
+"D@    c #006D70",
+"E@    c #006C70",
+"F@    c #006D6E",
+"G@    c #006E6F",
+"H@    c #007072",
+"I@    c #006F71",
+"J@    c #007071",
+"K@    c #006D71",
+"L@    c #006F72",
+"M@    c #007073",
+"N@    c #007173",
+"O@    c #006F73",
+"P@    c #007074",
+"Q@    c #006A6B",
+"R@    c #00575B",
+"S@    c #007172",
+"T@    c #007174",
+"U@    c #006266",
+"V@    c #007175",
+"W@    c #00656A",
+"X@    c #007274",
+"Y@    c #006E72",
+"Z@    c #006368",
+"`@    c #004F52",
+" #    c #004E51",
+".#    c #007376",
+"+#    c #007275",
+"@#    c #007276",
+"##    c #007375",
+"$#    c #007477",
+"%#    c #007476",
+"&#    c #005353",
+"*#    c #007377",
+"=#    c #007578",
+"-#    c #005A5E",
+";#    c #007577",
+">#    c #005155",
+",#    c #007679",
+"'#    c #007678",
+")#    c #00777A",
+"!#    c #007779",
+"~#    c #00787A",
+"{#    c #00767A",
+"]#    c #00787B",
+"^#    c #007478",
+"/#    c #00797C",
+"(#    c #00797B",
+"_#    c #007A7C",
+":#    c #007576",
+"<#    c #007879",
+"[#    c #007A7B",
+"}#    c #006263",
+"|#    c #005C5C",
+"1#    c #007A7D",
+"2#    c #007B7E",
+"3#    c #007B7D",
+"4#    c #00797D",
+"5#    c #007273",
+"6#    c #007C7E",
+"7#    c #007A7E",
+"8#    c #007D7F",
+"9#    c #007D80",
+"0#    c #007D81",
+"a#    c #007E80",
+"b#    c #007B7C",
+"c#    c #007F81",
+"d#    c #007D7E",
+"e#    c #007C7F",
+"f#    c #007E7F",
+"g#    c #007E83",
+"h#    c #007F82",
+"i#    c #007E81",
+"j#    c #007E82",
+"k#    c #007F83",
+"l#    c #007D82",
+"m#    c #007C80",
+"n#    c #008084",
+"o#    c #004C50",
+"p#    c #008184",
+"q#    c #008083",
+"r#    c #008183",
+"s#    c #008082",
+"t#    c #008286",
+"u#    c #008487",
+"v#    c #008387",
+"w#    c #008386",
+"x#    c #008185",
+"y#    c #006B6C",
+"z#    c #008284",
+"A#    c #008588",
+"B#    c #008488",
+"C#    c #008388",
+"D#    c #008287",
+"E#    c #008285",
+"F#    c #008589",
+"G#    c #00868B",
+"H#    c #00858A",
+"I#    c #00858B",
+"J#    c #00868A",
+"K#    c #00868C",
+"L#    c #008489",
+"M#    c #00797E",
+"N#    c #004A4E",
+"O#    c #00878B",
+"P#    c #00878D",
+"Q#    c #00878C",
+"R#    c #00888D",
+"S#    c #00888C",
+"T#    c #00888B",
+"U#    c #00898C",
+"V#    c #00878E",
+"W#    c #00898D",
+"X#    c #008A8E",
+"Y#    c #00898E",
+"Z#    c #008A8F",
+"`#    c #008A8D",
+" $    c #00898F",
+".$    c #008389",
+"+$    c #008990",
+"@$    c #00777B",
+"#$    c #008C91",
+"$$    c #008D91",
+"%$    c #008C90",
+"&$    c #008D92",
+"*$    c #008B90",
+"=$    c #006D72",
+"-$    c #008B91",
+";$    c #008186",
+">$    c #008E92",
+",$    c #008F93",
+"'$    c #008E93",
+")$    c #009094",
+"!$    c #008F92",
+"~$    c #008B8F",
+"{$    c #008F94",
+"]$    c #009195",
+"^$    c #009095",
+"/$    c #009194",
+"($    c #007F84",
+"_$    c #009093",
+":$    c #006869",
+"<$    c #009296",
+"[$    c #009297",
+"}$    c #009196",
+"|$    c #009397",
+"1$    c #009197",
+"2$    c #009096",
+"3$    c #009498",
+"4$    c #009598",
+"5$    c #009398",
+"6$    c #009497",
+"7$    c #008C8F",
+"8$    c #009295",
+"9$    c #009499",
+"0$    c #009599",
+"a$    c #00959A",
+"b$    c #00969A",
+"c$    c #009399",
+"d$    c #00969B",
+"e$    c #00959B",
+"f$    c #00949A",
+"g$    c #006061",
+"h$    c #009298",
+"i$    c #00989F",
+"j$    c #00979D",
+"k$    c #00989D",
+"l$    c #00989E",
+"m$    c #00979C",
+"n$    c #00979B",
+"o$    c #00979E",
+"p$    c #00999F",
+"q$    c #009A9F",
+"r$    c #0099A0",
+"s$    c #009AA0",
+"t$    c #008C92",
+"u$    c #009AA1",
+"v$    c #00999E",
+"w$    c #008689",
+"x$    c #009BA0",
+"y$    c #009CA0",
+"z$    c #009CA1",
+"A$    c #009BA1",
+"B$    c #00787C",
+"C$    c #009DA2",
+"D$    c #009EA3",
+"E$    c #009CA2",
+"F$    c #009DA3",
+"G$    c #009EA2",
+"H$    c #009CA3",
+"I$    c #009EA5",
+"J$    c #009FA5",
+"K$    c #009EA4",
+"L$    c #009DA4",
+"M$    c #00A0A6",
+"N$    c #009EA6",
+"O$    c #009FA6",
+"P$    c #008F95",
+"Q$    c #009BA2",
+"R$    c #00A1A7",
+"S$    c #00A0A7",
+"T$    c #007A7F",
+"U$    c #00959C",
+"V$    c #00A3A9",
+"W$    c #00A2A9",
+"X$    c #00A1A8",
+"Y$    c #00A2A8",
+"Z$    c #00A3AA",
+"`$    c #009B9F",
+" %    c #00A4AA",
+".%    c #00A5AA",
+"+%    c #00A3A8",
+"@%    c #008D90",
+"#%    c #009FA4",
+"$%    c #00A5AB",
+"%%    c #00A4A9",
+"&%    c #00787D",
+"*%    c #008385",
+"=%    c #00A4AB",
+"-%    c #00A5AC",
+";%    c #00A6AC",
+">%    c #00A6AD",
+",%    c #00A6AB",
+"'%    c #00A7AC",
+")%    c #00A8AE",
+"!%    c #00A7AE",
+"~%    c #00A8B0",
+"{%    c #00A7AF",
+"]%    c #00A9AF",
+"^%    c #00A8AF",
+"/%    c #007B80",
+"(%    c #00A7AD",
+"_%    c #00A6AE",
+":%    c #00A9B0",
+"<%    c #00777C",
+"[%    c #00A9B1",
+"}%    c #00A4AC",
+"|%    c #007B7F",
+"1%    c #00AAB1",
+"2%    c #00AAB2",
+"3%    c #00A9B2",
+"4%    c #01A3AA",
+"5%    c #01AAB2",
+"6%    c #01ABB3",
+"7%    c #01AAB1",
+"8%    c #01949A",
+"9%    c #01A5AC",
+"0%    c #01A8B0",
+"a%    c #018D91",
+"b%    c #01A1A6",
+"c%    c #019498",
+"d%    c #01A6AC",
+"e%    c #01ADB4",
+"f%    c #01ACB3",
+"g%    c #01ACB4",
+"h%    c #02ACB5",
+"i%    c #02ACB4",
+"j%    c #01ACB5",
+"k%    c #02A9B2",
+"l%    c #019DA2",
+"m%    c #018286",
+"n%    c #019AA0",
+"o%    c #02A8B0",
+"p%    c #00ABB3",
+"q%    c #01ADB5",
+"r%    c #01A7AF",
+"s%    c #02999F",
+"t%    c #019399",
+"u%    c #01A6AD",
+"v%    c #02ADB4",
+"w%    c #01A9B1",
+"x%    c #019CA2",
+"y%    c #018183",
+"z%    c #02787A",
+"A%    c #01989D",
+"B%    c #02A8AF",
+"C%    c #02AEB5",
+"D%    c #02ADB5",
+"E%    c #01AEB4",
+"F%    c #02AEB4",
+"G%    c #01ADB3",
+"H%    c #02A9B1",
+"I%    c #029BA1",
+"J%    c #017B7F",
+"K%    c #018387",
+"L%    c #019FA5",
+"M%    c #02AAB2",
+"N%    c #03AEB6",
+"O%    c #02A6AD",
+"P%    c #01787B",
+"Q%    c #03AEB4",
+"R%    c #02ACB3",
+"S%    c #02A8B1",
+"T%    c #029A9F",
+"U%    c #017A7C",
+"V%    c #028084",
+"W%    c #039EA4",
+"X%    c #03AAB3",
+"Y%    c #03AEB5",
+"Z%    c #03AFB6",
+"`%    c #03AFB5",
+" &    c #03B0B6",
+".&    c #03A8AF",
+"+&    c #02989D",
+"@&    c #028B8F",
+"#&    c #03A3AB",
+"$&    c #03ACB5",
+"%&    c #02AFB6",
+"&&    c #02AEB6",
+"*&    c #03ADB4",
+"=&    c #03A5AC",
+"-&    c #028F93",
+";&    c #039FA6",
+">&    c #03ABB3",
+",&    c #02AFB5",
+"'&    c #02969A",
+")&    c #048B8F",
+"!&    c #03A3AA",
+"~&    c #04ADB5",
+"{&    c #04B1B7",
+"]&    c #05B1B8",
+"^&    c #04B0B7",
+"/&    c #04B1B8",
+"(&    c #05B0B7",
+"_&    c #05A8AF",
+":&    c #049399",
+"<&    c #026C70",
+"[&    c #039399",
+"}&    c #03A7AF",
+"|&    c #05AFB7",
+"1&    c #04ADB6",
+"2&    c #04A3AA",
+"3&    c #048A8D",
+"4&    c #038C90",
+"5&    c #03A4AA",
+"6&    c #04AEB5",
+"7&    c #049297",
+"8&    c #036B6D",
+"9&    c #049296",
+"0&    c #05B0B6",
+"a&    c #05B2B9",
+"b&    c #05A7AD",
+"c&    c #048D92",
+"d&    c #03787B",
+"e&    c #039AA0",
+"f&    c #05ABB3",
+"g&    c #05AEB5",
+"h&    c #049FA5",
+"i&    c #048185",
+"j&    c #036C6F",
+"k&    c #049397",
+"l&    c #05A9B0",
+"m&    c #04AFB7",
+"n&    c #05AFB6",
+"o&    c #04A5AD",
+"p&    c #038B8F",
+"q&    c #037477",
+"r&    c #04979E",
+"s&    c #06B3B9",
+"t&    c #06B3BA",
+"u&    c #05A3AA",
+"v&    c #04878B",
+"w&    c #05A1A6",
+"x&    c #05B2B8",
+"y&    c #05ADB4",
+"z&    c #049CA1",
+"A&    c #03767A",
+"B&    c #059BA0",
+"C&    c #06B2B9",
+"D&    c #04B2B9",
+"E&    c #04A2A8",
+"F&    c #048589",
+"G&    c #047E82",
+"H&    c #05A0A6",
+"I&    c #06AFB7",
+"J&    c #08B4BB",
+"K&    c #07B4BB",
+"L&    c #06B4BB",
+"M&    c #06B4BA",
+"N&    c #07B3BA",
+"O&    c #06B0B7",
+"P&    c #069FA5",
+"Q&    c #047F81",
+"R&    c #058B90",
+"S&    c #05A6AD",
+"T&    c #07B4BA",
+"U&    c #07B2B9",
+"V&    c #06ABB3",
+"W&    c #05989C",
+"X&    c #058084",
+"Y&    c #059FA6",
+"Z&    c #07AFB6",
+"`&    c #059EA4",
+" *    c #047D81",
+".*    c #05878C",
+"+*    c #08A6AC",
+"@*    c #09B3B9",
+"#*    c #08B5BC",
+"$*    c #09B5BC",
+"%*    c #09B4BB",
+"&*    c #09AFB6",
+"**    c #069CA1",
+"=*    c #069399",
+"-*    c #07ABB2",
+";*    c #09B5BB",
+">*    c #08B6BD",
+",*    c #09B4BA",
+"'*    c #07AAB1",
+")*    c #049298",
+"!*    c #058A8E",
+"~*    c #07A5AC",
+"{*    c #08B2B9",
+"]*    c #08B4BC",
+"^*    c #07AEB5",
+"/*    c #079AA0",
+"(*    c #079195",
+"_*    c #09AAB2",
+":*    c #0AB5BC",
+"<*    c #0AB7BE",
+"[*    c #09B6BD",
+"}*    c #0AB6BD",
+"|*    c #09ADB5",
+"1*    c #07979C",
+"2*    c #057578",
+"3*    c #08AEB5",
+"4*    c #0AB7BD",
+"5*    c #08A9AF",
+"6*    c #078D91",
+"7*    c #069296",
+"8*    c #09ACB3",
+"9*    c #0AB6BC",
+"0*    c #06969A",
+"a*    c #057174",
+"b*    c #08999F",
+"c*    c #0AB0B6",
+"d*    c #0AB8BF",
+"e*    c #09B7BE",
+"f*    c #0BB8BF",
+"g*    c #0BB7BE",
+"h*    c #09AAB1",
+"i*    c #089196",
+"j*    c #067F83",
+"k*    c #09A1A8",
+"l*    c #0AB2BA",
+"m*    c #06868A",
+"n*    c #067276",
+"o*    c #099BA0",
+"p*    c #0AB6BE",
+"q*    c #0AB5BD",
+"r*    c #078F93",
+"s*    c #077C80",
+"t*    c #0AA1A8",
+"u*    c #0BB3BA",
+"v*    c #0DBAC1",
+"w*    c #0CB9C0",
+"x*    c #0CBAC1",
+"y*    c #0BB9C0",
+"z*    c #0CB6BD",
+"A*    c #0AA9AF",
+"B*    c #098B90",
+"C*    c #07888C",
+"D*    c #0AA7AF",
+"E*    c #0DB7BE",
+"F*    c #0CBAC0",
+"G*    c #0CB2BA",
+"H*    c #077E82",
+"I*    c #0BA2A8",
+"J*    c #0AB4BB",
+"K*    c #0BBAC1",
+"L*    c #0CB9C1",
+"M*    c #0BB6BE",
+"N*    c #07888E",
+"O*    c #08868B",
+"P*    c #0BA6AE",
+"Q*    c #0DBBC2",
+"R*    c #0CBBC2",
+"S*    c #0EBBC2",
+"T*    c #0CBBC1",
+"U*    c #0DBBC1",
+"V*    c #0DBAC2",
+"W*    c #0DB9C0",
+"X*    c #0BB5BB",
+"Y*    c #0BA4AB",
+"Z*    c #088488",
+"`*    c #0A9297",
+" =    c #0BACB3",
+".=    c #0EBAC1",
+"+=    c #0A9CA2",
+"@=    c #08888D",
+"#=    c #0BA7AE",
+"$=    c #0EB7BD",
+"%=    c #0EBAC2",
+"&=    c #0CB4BB",
+"*=    c #0AA3AA",
+"==    c #088085",
+"-=    c #05585C",
+";=    c #098F94",
+">=    c #0DABB3",
+",=    c #0CB8BF",
+"'=    c #0EBCC2",
+")=    c #0EBCC3",
+"!=    c #0FBCC3",
+"~=    c #0EB5BC",
+"{=    c #0AA0A6",
+"]=    c #0A999F",
+"^=    c #0CB1B8",
+"/=    c #0FBBC1",
+"(=    c #0DB0B7",
+"_=    c #0A959B",
+":=    c #0A9196",
+"<=    c #0DADB4",
+"[=    c #0EB9C0",
+"}=    c #0FBBC2",
+"|=    c #0EBAC0",
+"1=    c #0EB3BB",
+"2=    c #0B9FA4",
+"3=    c #097B80",
+"4=    c #0A969C",
+"5=    c #0DB1B7",
+"6=    c #0FBDC3",
+"7=    c #10BDC4",
+"8=    c #0EBDC3",
+"9=    c #0FBCC4",
+"0=    c #10BCC2",
+"a=    c #0EB4BA",
+"b=    c #0B9BA0",
+"c=    c #087C80",
+"d=    c #0CA3A9",
+"e=    c #0FB7BD",
+"f=    c #0FBEC3",
+"g=    c #0FBDC2",
+"h=    c #0FBDC4",
+"i=    c #10BAC1",
+"j=    c #0DACB3",
+"k=    c #0A9095",
+"l=    c #0B999F",
+"m=    c #0EB2BA",
+"n=    c #0EBDC2",
+"o=    c #0FBCC2",
+"p=    c #10BDC3",
+"q=    c #0EB2B9",
+"r=    c #0B989F",
+"s=    c #0C959A",
+"t=    c #09787B",
+"u=    c #0C9FA5",
+"v=    c #10B6BE",
+"w=    c #11BEC4",
+"x=    c #10BEC4",
+"y=    c #12BFC6",
+"z=    c #11BEC5",
+"A=    c #11BFC5",
+"B=    c #10BFC4",
+"C=    c #12BEC5",
+"D=    c #11BFC6",
+"E=    c #11BDC3",
+"F=    c #0DB0B8",
+"G=    c #0B9498",
+"H=    c #0A868A",
+"I=    c #0CA7AE",
+"J=    c #10BBC0",
+"K=    c #10BFC5",
+"L=    c #11BDC5",
+"M=    c #12BFC5",
+"N=    c #10B9C0",
+"O=    c #0DAAB0",
+"P=    c #0A898E",
+"Q=    c #0A7B7F",
+"R=    c #0CA2A8",
+"S=    c #10B7BE",
+"T=    c #10BEC5",
+"U=    c #0EB0B7",
+"V=    c #0A9197",
+"W=    c #0DA2A9",
+"X=    c #11B0B8",
+"Y=    c #0D9DA3",
+"Z=    c #0B8487",
+"`=    c #0EA7AF",
+" -    c #11BBC1",
+".-    c #13C1C7",
+"+-    c #12C0C6",
+"@-    c #14C1C7",
+"#-    c #12C1C7",
+"$-    c #13C0C6",
+"%-    c #11BCC2",
+"&-    c #0EACB3",
+"*-    c #0B8D91",
+"=-    c #0A8E94",
+"--    c #10AFB6",
+";-    c #12C1C6",
+">-    c #11B9C0",
+",-    c #0EA7AD",
+"'-    c #0A8689",
+")-    c #10A9B0",
+"!-    c #12BCC2",
+"~-    c #13C0C5",
+"{-    c #11C0C6",
+"]-    c #12C0C5",
+"^-    c #12BDC4",
+"/-    c #0B8C90",
+"(-    c #0FA8B0",
+"_-    c #12BBC2",
+":-    c #11B3BB",
+"<-    c #0D969B",
+"[-    c #0C8D91",
+"}-    c #10AEB5",
+"|-    c #13BEC4",
+"1-    c #14C2C8",
+"2-    c #13BCC3",
+"3-    c #10A9B1",
+"4-    c #0E999F",
+"5-    c #10B3BA",
+"6-    c #13BFC5",
+"7-    c #13C2C8",
+"8-    c #15C2C8",
+"9-    c #15C1C7",
+"0-    c #12B8BE",
+"a-    c #0EA0A6",
+"b-    c #0D8E93",
+"c-    c #11AEB5",
+"d-    c #13BDC4",
+"e-    c #10A9AF",
+"f-    c #104547",
+"g-    c #0A8085",
+"h-    c #11AFB5",
+"i-    c #14BEC5",
+"j-    c #11AFB6",
+"k-    c #0D8F94",
+"l-    c #0D959B",
+"m-    c #11B3BA",
+"n-    c #14BFC6",
+"o-    c #15C3C9",
+"p-    c #16C3C9",
+"q-    c #16C2C8",
+"r-    c #13B9C0",
+"s-    c #10A5AB",
+"t-    c #0A787C",
+"u-    c #10A2A8",
+"v-    c #13B9BF",
+"w-    c #17C3C9",
+"x-    c #13B6BD",
+"y-    c #0F9BA1",
+"z-    c #0D989E",
+"A-    c #13B4BC",
+"B-    c #10A3A9",
+"C-    c #0E8B90",
+"D-    c #14B4BB",
+"E-    c #18C3C9",
+"F-    c #17C4CA",
+"G-    c #16BFC6",
+"H-    c #11ABB2",
+"I-    c #10A0A6",
+"J-    c #16BAC1",
+"K-    c #17C2C8",
+"L-    c #18C5CA",
+"M-    c #18C5CB",
+"N-    c #16C1C7",
+"O-    c #16B9BF",
+"P-    c #109FA5",
+"Q-    c #0C8286",
+"R-    c #12A9AF",
+"S-    c #15BDC3",
+"T-    c #13B3B9",
+"U-    c #0F949A",
+"V-    c #10A1A7",
+"W-    c #15BAC2",
+"X-    c #15B8BF",
+"Y-    c #0F9DA3",
+"Z-    c #0F9297",
+"`-    c #15B7BD",
+" ;    c #19C6CC",
+".;    c #19C5CA",
+"+;    c #17BCC3",
+"@;    c #12A6AD",
+"#;    c #0C8185",
+"$;    c #12A8AF",
+"%;    c #17BDC4",
+"&;    c #19C5CB",
+"*;    c #19C6CD",
+"=;    c #19C6CB",
+"-;    c #18C5CC",
+";;    c #17B6BD",
+">;    c #10999F",
+",;    c #0F8D92",
+"';    c #15B0B8",
+");    c #18C1C8",
+"!;    c #1AC7CC",
+"~;    c #18C6CB",
+"{;    c #17C0C6",
+"];    c #14AFB6",
+"^;    c #0D8388",
+"/;    c #14AAAF",
+"(;    c #17BFC5",
+"_;    c #1AC6CC",
+":;    c #19C2C9",
+"<;    c #15B4BA",
+"[;    c #11979C",
+"};    c #11989D",
+"|;    c #17BAC0",
+"1;    c #1AC7CD",
+"2;    c #19C7CC",
+"3;    c #18BBC2",
+"4;    c #139FA6",
+"5;    c #0E8A90",
+"6;    c #16AFB5",
+"7;    c #19C1C8",
+"8;    c #1BC8CD",
+"9;    c #1AC2C9",
+"0;    c #15B2B8",
+"a;    c #109196",
+"b;    c #16B6BD",
+"c;    c #1AC5CB",
+"d;    c #1AC7CE",
+"e;    c #18BFC5",
+"f;    c #14AAB1",
+"g;    c #0F8C92",
+"h;    c #15B0B7",
+"i;    c #19C2C8",
+"j;    c #1BC7CD",
+"k;    c #1AC7CB",
+"l;    c #1BC8CE",
+"m;    c #16B1B9",
+"n;    c #108F94",
+"o;    c #139FA4",
+"p;    c #1ABFC5",
+"q;    c #1CCACF",
+"r;    c #1CC9CF",
+"s;    c #1CC9CE",
+"t;    c #1BC6CB",
+"u;    c #19B8BF",
+"v;    c #1299A0",
+"w;    c #12949A",
+"x;    c #18B5BC",
+"y;    c #1AC4C9",
+"z;    c #1CC8CE",
+"A;    c #1BC8CF",
+"B;    c #1CC9CD",
+"C;    c #1BC7CE",
+"D;    c #1AC2C8",
+"E;    c #17B0B6",
+"F;    c #13A1A7",
+"G;    c #19BCC2",
+"H;    c #1CC8CD",
+"I;    c #1BC9CE",
+"J;    c #1CC7CD",
+"K;    c #1ABEC4",
+"L;    c #14A5AB",
+"M;    c #11979D",
+"N;    c #18B7BD",
+"O;    c #1AC4CA",
+"P;    c #1CC8CF",
+"Q;    c #1AC1C8",
+"R;    c #16AEB4",
+"S;    c #15A5AB",
+"T;    c #1DC3C9",
+"U;    c #1DCBCF",
+"V;    c #1ECBD0",
+"W;    c #1DCACF",
+"X;    c #1CC6CC",
+"Y;    c #19B5BB",
+"Z;    c #129398",
+"`;    c #159EA4",
+" >    c #1ABBC1",
+".>    c #1DC8CD",
+"+>    c #1DCAD0",
+"@>    c #1DCBD0",
+"#>    c #1ECCD0",
+"$>    c #1CC2C7",
+"%>    c #17AAB0",
+"&>    c #0F8084",
+"*>    c #16A9AF",
+"=>    c #1CC2C6",
+"->    c #1DC9CE",
+";>    c #1ABCC2",
+">>    c #14A0A5",
+",>    c #14A1A7",
+"'>    c #1ABDC3",
+")>    c #1DC7CE",
+"!>    c #1DCBD1",
+"~>    c #1BC1C7",
+"{>    c #17ABB1",
+"]>    c #1DC6CC",
+"^>    c #20CED2",
+"/>    c #1FCCD1",
+"(>    c #1FCDD1",
+"_>    c #1ECCD1",
+":>    c #1EC6CB",
+"<>    c #1AB2B8",
+"[>    c #17A7AD",
+"}>    c #1DC1C7",
+"|>    c #20CCD1",
+"1>    c #1FCDD2",
+"2>    c #20CDD2",
+"3>    c #1FCED2",
+"4>    c #1FCBD0",
+"5>    c #1DC0C7",
+"6>    c #18A5AB",
+"7>    c #128B90",
+"8>    c #19B1B8",
+"9>    c #1DC5CA",
+"0>    c #1EC8CD",
+"a>    c #1BBAC0",
+"b>    c #15999D",
+"c>    c #107F83",
+"d>    c #18A9AF",
+"e>    c #1CC0C7",
+"f>    c #1FCCD2",
+"g>    c #1CBEC5",
+"h>    c #12A0A5",
+"i>    c #016E73",
+"j>    c #1AB1B8",
+"k>    c #1FCACF",
+"l>    c #20CDD0",
+"m>    c #1EC3C9",
+"n>    c #19ABB2",
+"o>    c #12888B",
+"p>    c #1AB0B6",
+"q>    c #1EC5CB",
+"r>    c #20CDD1",
+"s>    c #20CBCF",
+"t>    c #1CBBC1",
+"u>    c #159CA1",
+"v>    c #15959B",
+"w>    c #1CB8BE",
+"x>    c #1FC7CC",
+"y>    c #1FC8CD",
+"z>    c #1BB5BC",
+"A>    c #138F94",
+"B>    c #12898F",
+"C>    c #19B0B7",
+"D>    c #20CACF",
+"E>    c #1DBCC2",
+"F>    c #12888C",
+"G>    c #1CB8BD",
+"H>    c #20CCD0",
+"I>    c #20CFD3",
+"J>    c #21CFD3",
+"K>    c #20CED3",
+"L>    c #1EC1C6",
+"M>    c #18A4A9",
+"N>    c #149197",
+"O>    c #1BB7BD",
+"P>    c #20C9CF",
+"Q>    c #1FC9CE",
+"R>    c #149499",
+"S>    c #17A0A5",
+"T>    c #1CBDC3",
+"U>    c #20CAD0",
+"V>    c #21CFD2",
+"W>    c #1FC6CB",
+"X>    c #1BAFB6",
+"Y>    c #1CB7BD",
+"Z>    c #1FCED3",
+"`>    c #1FC7CD",
+" ,    c #1CB6BD",
+".,    c #0F8D93",
+"+,    c #158F94",
+"@,    c #1EBCC3",
+"#,    c #22CFD3",
+"$,    c #21D1D4",
+"%,    c #21D0D4",
+"&,    c #21D0D5",
+"*,    c #21D1D5",
+"=,    c #20CFD4",
+"-,    c #22D1D5",
+";,    c #22D0D4",
+">,    c #21CDD1",
+",,    c #1EBFC4",
+"',    c #179DA2",
+"),    c #189EA2",
+"!,    c #1FBEC4",
+"~,    c #22D1D4",
+"{,    c #20C8CD",
+"],    c #1CB4B9",
+"^,    c #1AA8AE",
+"/,    c #1FC4C9",
+"(,    c #21CED2",
+"_,    c #1FC5CA",
+":,    c #19A9AF",
+"<,    c #189FA4",
+"[,    c #21CDD2",
+"},    c #22D0D5",
+"|,    c #21CFD4",
+"1,    c #1BB1B7",
+"2,    c #004B4E",
+"3,    c #17979D",
+"4,    c #20C1C7",
+"5,    c #23D2D6",
+"6,    c #24D3D5",
+"7,    c #23D2D5",
+"8,    c #24D3D7",
+"9,    c #24D2D6",
+"0,    c #23CED2",
+"a,    c #1FBAC1",
+"b,    c #17969A",
+"c,    c #1BA8AD",
+"d,    c #21C4C9",
+"e,    c #24D3D6",
+"f,    c #23D0D4",
+"g,    c #21C8CC",
+"h,    c #1DAEB5",
+"i,    c #15888C",
+"j,    c #1DB1B7",
+"k,    c #22C9CF",
+"l,    c #23D1D5",
+"m,    c #23D3D6",
+"n,    c #23D0D3",
+"o,    c #19A3A8",
+"p,    c #1BA9AF",
+"q,    c #22C6CB",
+"r,    c #23D0D5",
+"s,    c #23D3D5",
+"t,    c #22C7CC",
+"u,    c #13A7AD",
+"v,    c #005256",
+"w,    c #189EA3",
+"x,    c #22C5CA",
+"y,    c #25D3D7",
+"z,    c #26D4D7",
+"A,    c #26D4D8",
+"B,    c #25D2D6",
+"C,    c #23CCD0",
+"D,    c #1EB6BC",
+"E,    c #148588",
+"F,    c #1DAFB4",
+"G,    c #22C8CD",
+"H,    c #25D2D5",
+"I,    c #26D3D7",
+"J,    c #25D3D6",
+"K,    c #26D4D6",
+"L,    c #25D4D7",
+"M,    c #21C6CA",
+"N,    c #1BA8AE",
+"O,    c #179297",
+"P,    c #20B9BE",
+"Q,    c #23CDD0",
+"R,    c #24CFD3",
+"S,    c #20BEC3",
+"T,    c #189AA0",
+"U,    c #14868B",
+"V,    c #1DB2B7",
+"W,    c #24D1D5",
+"X,    c #1FC2C8",
+"Y,    c #21A7AD",
+"Z,    c #1CA6AB",
+"`,    c #23C9CD",
+" '    c #27D5D8",
+".'    c #27D4D8",
+"+'    c #26D5D8",
+"@'    c #23CBCF",
+"#'    c #1EAFB4",
+"$'    c #178E93",
+"%'    c #1FB7BC",
+"&'    c #24CCD0",
+"*'    c #27D4D7",
+"='    c #27D5D7",
+"-'    c #25D1D5",
+";'    c #21C2C7",
+">'    c #1BA2A6",
+",'    c #1A9DA2",
+"''    c #21BFC4",
+")'    c #25D0D5",
+"!'    c #25CED1",
+"~'    c #20B9BF",
+"{'    c #179196",
+"]'    c #20B8BD",
+"^'    c #24CDD1",
+"/'    c #25D0D4",
+"('    c #19BCC1",
+"_'    c #10979C",
+":'    c #1EACB2",
+"<'    c #27CED2",
+"['    c #29D8DA",
+"}'    c #29D7DA",
+"|'    c #28D7DA",
+"1'    c #29D8DB",
+"2'    c #29D6D9",
+"3'    c #28D4D7",
+"4'    c #24C6CB",
+"5'    c #1DA9AE",
+"6'    c #1A999E",
+"7'    c #22BEC3",
+"8'    c #27D2D5",
+"9'    c #28D6D9",
+"0'    c #23BEC4",
+"a'    c #1A999D",
+"b'    c #1DA7AC",
+"c'    c #25C7CA",
+"d'    c #28D4D8",
+"e'    c #29D7D9",
+"f'    c #26CDD0",
+"g'    c #1FB5B9",
+"h'    c #1B9DA2",
+"i'    c #21BFC5",
+"j'    c #27D2D6",
+"k'    c #28D1D4",
+"l'    c #1AB9BE",
+"m'    c #026D72",
+"n'    c #20B4B9",
+"o'    c #28D4D6",
+"p'    c #23C3C8",
+"q'    c #1CA1A6",
+"r'    c #1DA4A8",
+"s'    c #25C5CA",
+"t'    c #29D4D8",
+"u'    c #2AD9DB",
+"v'    c #28D8DA",
+"w'    c #2AD8DB",
+"x'    c #2AD8DA",
+"y'    c #26CFD3",
+"z'    c #21B7BD",
+"A'    c #1FB0B5",
+"B'    c #27CCD0",
+"C'    c #28D8DB",
+"D'    c #28D6D8",
+"E'    c #26CACF",
+"F'    c #1EADB3",
+"G'    c #1EA6AA",
+"H'    c #26C6CB",
+"I'    c #29D5D8",
+"J'    c #27CFD3",
+"K'    c #1CAFB4",
+"L'    c #168488",
+"M'    c #23BABF",
+"N'    c #2AD5D8",
+"O'    c #2ADADD",
+"P'    c #2AD9DC",
+"Q'    c #2ADADC",
+"R'    c #2ADADB",
+"S'    c #2ADBDC",
+"T'    c #29D9DA",
+"U'    c #29D2D6",
+"V'    c #23BFC4",
+"W'    c #1B999E",
+"X'    c #1FAEB2",
+"Y'    c #26CBCF",
+"Z'    c #2AD7DB",
+"`'    c #29D9DB",
+" )    c #28CDD1",
+".)    c #20B1B6",
+"+)    c #198F95",
+"@)    c #22B9BF",
+"#)    c #2AD9DD",
+"$)    c #2BDADC",
+"%)    c #2AD6D9",
+"&)    c #1EA5AB",
+"*)    c #20AFB5",
+"=)    c #29D8DC",
+"-)    c #2ADBDD",
+";)    c #2BD8DA",
+">)    c #26C8CD",
+",)    c #178A8F",
+"')    c #25C0C5",
+"))    c #2CD9DC",
+"!)    c #2CDDDF",
+"~)    c #2BDBDD",
+"{)    c #2CDBDD",
+"])    c #2BDCDD",
+"^)    c #2DDCDE",
+"/)    c #2CDCDD",
+"()    c #2CDBDE",
+"_)    c #2CDDDE",
+":)    c #29D2D5",
+"<)    c #24BAC0",
+"[)    c #188B90",
+"})    c #23B7BD",
+"|)    c #2AD0D4",
+"1)    c #2CDCDE",
+"2)    c #2BDBDC",
+"3)    c #2DDCDD",
+"4)    c #2CDBDC",
+"5)    c #2BD8DB",
+"6)    c #28CACF",
+"7)    c #21ADB1",
+"8)    c #1C9AA0",
+"9)    c #26C1C6",
+"0)    c #2DDDDD",
+"a)    c #2BDADD",
+"b)    c #2BD7D9",
+"c)    c #26C3C8",
+"d)    c #1D9FA4",
+"e)    c #198D92",
+"f)    c #23B9BD",
+"g)    c #2CDDDD",
+"h)    c #2BD7D8",
+"i)    c #1A9397",
+"j)    c #27C6CA",
+"k)    c #2EDBDD",
+"l)    c #2DDEDF",
+"m)    c #2DDDDF",
+"n)    c #2EDDDF",
+"o)    c #2DDEDE",
+"p)    c #2EDEDF",
+"q)    c #2DDDDE",
+"r)    c #2EDEDE",
+"s)    c #2BD1D4",
+"t)    c #22B5BA",
+"u)    c #1C969B",
+"v)    c #27C0C5",
+"w)    c #2CD6D8",
+"x)    c #2DDBDD",
+"y)    c #28C8CC",
+"z)    c #1FA4AA",
+"A)    c #1FA5AA",
+"B)    c #2CD9DB",
+"C)    c #2AD4D7",
+"D)    c #26C0C4",
+"E)    c #1D999D",
+"F)    c #26C0C5",
+"G)    c #2BD6D9",
+"H)    c #2EDDDE",
+"I)    c #07575A",
+"J)    c #1E9DA0",
+"K)    c #29CACE",
+"L)    c #2EE0E1",
+"M)    c #2EDFE0",
+"N)    c #2FDFE0",
+"O)    c #2EDEE0",
+"P)    c #2EDCDE",
+"Q)    c #2ACED2",
+"R)    c #22AEB2",
+"S)    c #1FA2A6",
+"T)    c #29C6CA",
+"U)    c #2DD9DC",
+"V)    c #2EDFDF",
+"W)    c #2CD8DA",
+"X)    c #27C3C8",
+"Y)    c #1D9CA1",
+"Z)    c #23AFB3",
+"`)    c #2ACED1",
+" !    c #2FDFDF",
+".!    c #2CD4D7",
+"+!    c #25B9BD",
+"@!    c #1FA3A8",
+"#!    c #29C9CC",
+"$!    c #2DDADC",
+"%!    c #085E62",
+"&!    c #21A3A9",
+"*!    c #2CCFD2",
+"=!    c #2FE0E1",
+"-!    c #30E1E1",
+";!    c #30E0E1",
+">!    c #2AC9CC",
+",!    c #22A5AA",
+"'!    c #22ABB1",
+")!    c #2BCCD0",
+"!!    c #2DDBDC",
+"~!    c #2DD6D9",
+"{!    c #27BEC4",
+"]!    c #24B8BD",
+"^!    c #2CD3D7",
+"/!    c #2FDEE0",
+"(!    c #2FDEDF",
+"_!    c #2CD1D4",
+":!    c #23B2B7",
+"<!    c #23AEB2",
+"[!    c #0A666B",
+"}!    c #23ABB1",
+"|!    c #2DD3D5",
+"1!    c #2EDADD",
+"2!    c #2AC3C8",
+"3!    c #25B5BA",
+"4!    c #2DD3D4",
+"5!    c #30DFE0",
+"6!    c #2DD4D6",
+"7!    c #26B7BC",
+"8!    c #1C959A",
+"9!    c #28C1C6",
+"0!    c #2ED9DB",
+"a!    c #30E1E2",
+"b!    c #2FDDDF",
+"c!    c #23AAB0",
+"d!    c #26B8BD",
+"e!    c #0C6E72",
+"f!    c #25B4B9",
+"g!    c #2ED7D8",
+"h!    c #31E3E3",
+"i!    c #32E2E3",
+"j!    c #31E1E2",
+"k!    c #32E2E2",
+"l!    c #31E2E2",
+"m!    c #32E3E3",
+"n!    c #2ED8DA",
+"o!    c #29BFC3",
+"p!    c #1E9498",
+"q!    c #28BFC2",
+"r!    c #2FD8DA",
+"s!    c #32E3E2",
+"t!    c #31E1E1",
+"u!    c #31DFE1",
+"v!    c #2ED2D4",
+"w!    c #24AEB4",
+"x!    c #22A3A7",
+"y!    c #2BC8CD",
+"z!    c #2FDDDE",
+"A!    c #31E2E1",
+"B!    c #32E1E2",
+"C!    c #30DDDE",
+"D!    c #2BC8CA",
+"E!    c #21A1A6",
+"F!    c #1E969A",
+"G!    c #29C0C3",
+"H!    c #2FD7DA",
+"I!    c #32E1E1",
+"J!    c #30E2E2",
+"K!    c #32E1E3",
+"L!    c #12787C",
+"M!    c #29BCC0",
+"N!    c #31DDDD",
+"O!    c #33E5E4",
+"P!    c #33E3E3",
+"Q!    c #33E4E3",
+"R!    c #33E4E4",
+"S!    c #2FD6D8",
+"T!    c #28B7BC",
+"U!    c #219EA2",
+"V!    c #2CC7CB",
+"W!    c #31DDDE",
+"X!    c #34E4E3",
+"Y!    c #32E4E3",
+"Z!    c #32E0E0",
+"`!    c #2CCCCF",
+" ~    c #24A7AC",
+".~    c #24ADB2",
+"+~    c #2ED1D3",
+"@~    c #32E4E4",
+"#~    c #33E3E4",
+"$~    c #33E2E3",
+"%~    c #34E4E4",
+"&~    c #30DBDC",
+"*~    c #2BC2C6",
+"=~    c #22A1A6",
+"-~    c #2CC8CB",
+";~    c #1C868A",
+">~    c #2BC3C6",
+",~    c #34E0E0",
+"'~    c #34E5E5",
+")~    c #34E5E4",
+"!~    c #34E6E5",
+"~~    c #34E6E4",
+"{~    c #35E6E5",
+"]~    c #34E6E6",
+"^~    c #33E2E2",
+"/~    c #2FD4D6",
+"(~    c #26B1B6",
+"_~    c #24A9AE",
+":~    c #2ED0D1",
+"<~    c #34E2E2",
+"[~    c #35E6E6",
+"}~    c #35E5E4",
+"|~    c #32DEDF",
+"1~    c #2DC8CB",
+"2~    c #31D8D9",
+"3~    c #34E5E6",
+"4~    c #35E5E5",
+"5~    c #35E4E3",
+"6~    c #31DADB",
+"7~    c #2ABFC2",
+"8~    c #26ACB0",
+"9~    c #2ECFD2",
+"0~    c #1F8F93",
+"a~    c #34E3E3",
+"b~    c #36E8E7",
+"c~    c #37E8E7",
+"d~    c #37E7E6",
+"e~    c #36E7E6",
+"f~    c #37E7E7",
+"g~    c #36E6E6",
+"h~    c #35E2E3",
+"i~    c #2FD0D2",
+"j~    c #25A9AD",
+"k~    c #28B4B8",
+"l~    c #31D7D9",
+"m~    c #37E5E5",
+"n~    c #36E8E6",
+"o~    c #36E7E5",
+"p~    c #36E7E7",
+"q~    c #33DEDE",
+"r~    c #2CC3C7",
+"s~    c #209397",
+"t~    c #2CC1C4",
+"u~    c #32DDDD",
+"v~    c #35E7E5",
+"w~    c #35E7E6",
+"x~    c #37E8E6",
+"y~    c #36E6E5",
+"z~    c #31D9DB",
+"A~    c #29B7BB",
+"B~    c #29B6BB",
+"C~    c #32D7D9",
+"D~    c #36E5E4",
+"E~    c #21979C",
+"F~    c #2FCDD0",
+"G~    c #36E5E6",
+"H~    c #38E9E8",
+"I~    c #38E8E8",
+"J~    c #38E8E7",
+"K~    c #38E7E7",
+"L~    c #35E1E2",
+"M~    c #2ECBCD",
+"N~    c #2BBFC2",
+"O~    c #33DCDE",
+"P~    c #37E6E6",
+"Q~    c #37E8E8",
+"R~    c #33DBDB",
+"S~    c #2BBCC0",
+"T~    c #239DA2",
+"U~    c #2FC9CC",
+"V~    c #31D4D6",
+"W~    c #27AEB3",
+"X~    c #34DDDE",
+"Y~    c #186467",
+"Z~    c #239EA2",
+"`~    c #32D2D5",
+" {    c #39E9E8",
+".{    c #39E8E8",
+"+{    c #35E0E0",
+"@{    c #2EC5C7",
+"#{    c #239B9E",
+"${    c #2EC7CA",
+"%{    c #35E1E1",
+"&{    c #32D7D8",
+"*{    c #2AB5B8",
+"={    c #25A8AC",
+"-{    c #32D0D2",
+";{    c #37E4E4",
+">{    c #2FCFD0",
+",{    c #239CA0",
+"'{    c #2EC9CC",
+"){    c #36E1E1",
+"!{    c #3AEAE8",
+"~{    c #39E9E7",
+"{{    c #239EA1",
+"]{    c #32D2D3",
+"^{    c #39E7E7",
+"/{    c #3AEAE9",
+"({    c #3AE8E7",
+"_{    c #35DDDD",
+":{    c #2CBDC0",
+"<{    c #26A6AA",
+"[{    c #31D0D1",
+"}{    c #37E4E3",
+"|{    c #3AE9E8",
+"1{    c #38E5E4",
+"2{    c #31D3D4",
+"3{    c #27ADB0",
+"4{    c #2AB4B9",
+"5{    c #33D8D9",
+"6{    c #36E2E1",
+"7{    c #2FC8CC",
+"8{    c #27A8AC",
+"9{    c #31D2D4",
+"0{    c #37E5E4",
+"a{    c #0A8084",
+"b{    c #30C7CA",
+"c{    c #38E3E3",
+"d{    c #3BEBE9",
+"e{    c #3BECEA",
+"f{    c #3CECEA",
+"g{    c #34D8D9",
+"h{    c #2AB3B6",
+"i{    c #2AB2B5",
+"j{    c #33D8D8",
+"k{    c #39E7E6",
+"l{    c #37E3E3",
+"m{    c #31CDCF",
+"n{    c #2CBFC2",
+"o{    c #37E0E0",
+"p{    c #3BEAE9",
+"q{    c #36DFDF",
+"r{    c #2DC1C4",
+"s{    c #2AB4B8",
+"t{    c #35D9DA",
+"u{    c #3BEAE8",
+"v{    c #149BA0",
+"w{    c #36D7D7",
+"x{    c #3CE9E7",
+"y{    c #3DEDEB",
+"z{    c #3DECEB",
+"A{    c #3DEDEC",
+"B{    c #3EEEEB",
+"C{    c #3EEDEB",
+"D{    c #3BE9E8",
+"E{    c #34D4D5",
+"F{    c #28ACB0",
+"G{    c #2DBDC0",
+"H{    c #37DEDE",
+"I{    c #3DEAE9",
+"J{    c #3DEEEB",
+"K{    c #3EEDEC",
+"L{    c #39E5E3",
+"M{    c #31C9CA",
+"N{    c #249B9E",
+"O{    c #31CBCD",
+"P{    c #3AE5E4",
+"Q{    c #3DEDEA",
+"R{    c #3CEBE9",
+"S{    c #37DCDC",
+"T{    c #2CBBBD",
+"U{    c #2FBFC2",
+"V{    c #37DFDF",
+"W{    c #14A7AA",
+"X{    c #39DDDC",
+"Y{    c #3DEBEA",
+"Z{    c #3FEEEC",
+"`{    c #3EEEED",
+" ]    c #3EEFED",
+".]    c #3FEDEC",
+"+]    c #3FEFED",
+"@]    c #3EEEEC",
+"#]    c #3EEDED",
+"$]    c #3CE7E6",
+"%]    c #33CFD0",
+"&]    c #249599",
+"*]    c #31C6C8",
+"=]    c #3AE4E2",
+"-]    c #3FEEED",
+";]    c #3FEDED",
+">]    c #38E1E0",
+",]    c #2FC2C3",
+"']    c #28A6AA",
+")]    c #34D2D4",
+"!]    c #3DEAE8",
+"~]    c #36DADA",
+"{]    c #2CB3B6",
+"]]    c #23999D",
+"^]    c #30C9CA",
+"/]    c #3AE4E3",
+"(]    c #23B9BB",
+"_]    c #39E1E1",
+":]    c #3FEEEB",
+"<]    c #40EFED",
+"[]    c #40F0ED",
+"}]    c #40EEED",
+"|]    c #3FEFEC",
+"1]    c #3BE5E3",
+"2]    c #32C9CB",
+"3]    c #26A1A5",
+"4]    c #33D0D0",
+"5]    c #3DE8E7",
+"6]    c #40EFEE",
+"7]    c #3FF0ED",
+"8]    c #40F0EE",
+"9]    c #38DDDD",
+"0]    c #2CB7BB",
+"a]    c #2BB2B6",
+"b]    c #37DADA",
+"c]    c #3EEBE9",
+"d]    c #3DEAE7",
+"e]    c #35D5D6",
+"f]    c #28A4A7",
+"g]    c #35D1D3",
+"h]    c #3DE9E7",
+"i]    c #0C868C",
+"j]    c #33CACB",
+"k]    c #3DE7E4",
+"l]    c #40EFEC",
+"m]    c #41F1ED",
+"n]    c #41F0ED",
+"o]    c #3AE2E1",
+"p]    c #30C1C4",
+"q]    c #2BADB0",
+"r]    c #37D8D8",
+"s]    c #3FECEA",
+"t]    c #41F1EE",
+"u]    c #3EECEA",
+"v]    c #2BAEB3",
+"w]    c #2FBDC0",
+"x]    c #3AE0E0",
+"y]    c #40EDEA",
+"z]    c #40F1ED",
+"A]    c #3DE8E6",
+"B]    c #34CED0",
+"C]    c #2BB0B4",
+"D]    c #38D9D9",
+"E]    c #3FEBE9",
+"F]    c #40F0EC",
+"G]    c #1E9DA2",
+"H]    c #36D2D3",
+"I]    c #3FEAE8",
+"J]    c #42F0EE",
+"K]    c #42F1EE",
+"L]    c #43F2EF",
+"M]    c #43F1EE",
+"N]    c #41EEEC",
+"O]    c #3ADEDE",
+"P]    c #2FB9BC",
+"Q]    c #2FBABD",
+"R]    c #3AE0DF",
+"S]    c #42F1ED",
+"T]    c #3FEBE8",
+"U]    c #35D2D2",
+"V]    c #32C7C9",
+"W]    c #3DE5E4",
+"X]    c #41EFEC",
+"Y]    c #32C8CA",
+"Z]    c #2EBABE",
+"`]    c #3BE0DF",
+" ^    c #40EEEC",
+".^    c #25ACAF",
+"+^    c #39DBDA",
+"@^    c #41EEEA",
+"#^    c #40EDEB",
+"$^    c #39D9DA",
+"%^    c #2BAEB1",
+"&^    c #31C4C6",
+"*^    c #3EE5E3",
+"=^    c #42F0ED",
+"-^    c #42F2EE",
+";^    c #43F2EE",
+">^    c #3EE8E6",
+",^    c #28A1A6",
+"'^    c #35CFD1",
+")^    c #3FE9E7",
+"!^    c #43F1EF",
+"~^    c #42F2EF",
+"{^    c #41EFED",
+"]^    c #3CE3E0",
+"^^    c #30BDC0",
+"/^    c #32C6C8",
+"(^    c #3EE7E4",
+"_^    c #30BCBF",
+":^    c #3DE3E1",
+"<^    c #44F1EE",
+"[^    c #45F4F0",
+"}^    c #43F3EF",
+"|^    c #44F4F0",
+"1^    c #44F3F0",
+"2^    c #43F2F0",
+"3^    c #37D4D4",
+"4^    c #279DA1",
+"5^    c #35CECF",
+"6^    c #40EBE7",
+"7^    c #43F3F0",
+"8^    c #3DE5E2",
+"9^    c #32C3C5",
+"0^    c #2BADB1",
+"a^    c #3AD9D9",
+"b^    c #42EFEC",
+"c^    c #44F3EF",
+"d^    c #3ADDDC",
+"e^    c #2EB4B7",
+"f^    c #27A0A4",
+"g^    c #36D2D1",
+"h^    c #41ECE9",
+"i^    c #44F2EF",
+"j^    c #45F3F0",
+"k^    c #34C8CA",
+"l^    c #40E8E6",
+"m^    c #46F5F0",
+"n^    c #47F6F1",
+"o^    c #46F5F1",
+"p^    c #47F5F1",
+"q^    c #45F5F0",
+"r^    c #45F5F1",
+"s^    c #45F4F1",
+"t^    c #46F4F1",
+"u^    c #41EBE8",
+"v^    c #36CCCD",
+"w^    c #2BAAAD",
+"x^    c #3BD9D8",
+"y^    c #44EFEC",
+"z^    c #3EE3E1",
+"A^    c #30BBBD",
+"B^    c #30BABD",
+"C^    c #3EE3E2",
+"D^    c #46F3F0",
+"E^    c #47F5F0",
+"F^    c #46F4F0",
+"G^    c #39D8D8",
+"H^    c #2CADB0",
+"I^    c #3AD9DA",
+"J^    c #43F0EC",
+"K^    c #2AA1A4",
+"L^    c #38D1D2",
+"M^    c #42EDE9",
+"N^    c #47F5F2",
+"O^    c #47F6F2",
+"P^    c #48F5F1",
+"Q^    c #40E7E5",
+"R^    c #34C4C6",
+"S^    c #30B6B9",
+"T^    c #3DDFDD",
+"U^    c #44F1ED",
+"V^    c #48F5F2",
+"W^    c #45F2EE",
+"X^    c #3CDEDC",
+"Y^    c #2EB1B5",
+"Z^    c #34C4C7",
+"`^    c #40E8E5",
+" /    c #48F6F2",
+"./    c #48F6F1",
+"+/    c #43EDEA",
+"@/    c #30B8BC",
+"#/    c #3EE1E0",
+"$/    c #44F2EE",
+"%/    c #46F5F2",
+"&/    c #3BDBDA",
+"*/    c #45F1ED",
+"=/    c #49F7F2",
+"-/    c #4AF7F2",
+";/    c #49F7F1",
+">/    c #49F6F2",
+",/    c #46F3EF",
+"'/    c #3FE2E0",
+")/    c #31BBBD",
+"!/    c #33C1C3",
+"~/    c #3FE5E2",
+"{/    c #47F3EF",
+"]/    c #45F2EC",
+"^/    c #3AD6D7",
+"//    c #38CECF",
+"(/    c #43EDE9",
+"_/    c #49F6F1",
+":/    c #49F7F3",
+"</    c #48F7F2",
+"[/    c #47F4F1",
+"}/    c #42EAE6",
+"|/    c #36C9CA",
+"1/    c #33C2C4",
+"2/    c #40E7E3",
+"3/    c #47F3F0",
+"4/    c #32B9BD",
+"5/    c #40E3E1",
+"6/    c #47F4EF",
+"7/    c #4CF8F3",
+"8/    c #4BF8F3",
+"9/    c #4BF7F2",
+"0/    c #4DF8F3",
+"a/    c #49F6F3",
+"b/    c #4BF7F3",
+"c/    c #4BF8F2",
+"d/    c #46F1ED",
+"e/    c #3EDDDC",
+"f/    c #2FB1B3",
+"g/    c #36CACC",
+"h/    c #44EDE9",
+"i/    c #4CF7F2",
+"j/    c #45EEEB",
+"k/    c #38CFCF",
+"l/    c #2CA9AB",
+"m/    c #3AD9D7",
+"n/    c #46F1EC",
+"o/    c #4CF7F3",
+"p/    c #49F6F0",
+"q/    c #42E7E4",
+"r/    c #34C2C3",
+"s/    c #38CCCD",
+"t/    c #4AF6F1",
+"u/    c #36C5C6",
+"v/    c #42E9E5",
+"w/    c #4FF8F3",
+"x/    c #50F8F4",
+"y/    c #4FF8F4",
+"z/    c #4EF8F3",
+"A/    c #4DF7F4",
+"B/    c #47F1ED",
+"C/    c #3AD7D6",
+"D/    c #2CA3A6",
+"E/    c #3BD6D5",
+"F/    c #45F1EC",
+"G/    c #4DF7F3",
+"H/    c #4EF8F4",
+"I/    c #50F9F4",
+"J/    c #4CF6F2",
+"K/    c #43E9E5",
+"L/    c #35C5C7",
+"M/    c #30B5B7",
+"N/    c #3FE0DF",
+"O/    c #49F4F0",
+"P/    c #4BF5F0",
+"Q/    c #40E2DF",
+"R/    c #30B7B9",
+"S/    c #2CA6A9",
+"T/    c #4DF8F2",
+"U/    c #39CFCF",
+"V/    c #46EFEA",
+"W/    c #4EF7F2",
+"X/    c #52F9F5",
+"Y/    c #52F8F4",
+"Z/    c #53F9F5",
+"`/    c #51F8F4",
+" (    c #51F9F5",
+".(    c #50F8F3",
+"+(    c #3AD0D0",
+"@(    c #2FB2B3",
+"#(    c #3FDFDD",
+"$(    c #49F4EF",
+"%(    c #52F9F4",
+"&(    c #51F8F5",
+"*(    c #4CF6F1",
+"=(    c #33BEBF",
+"-(    c #34C0C2",
+";(    c #42E8E4",
+">(    c #4DF6F2",
+",(    c #50F9F3",
+"'(    c #49F3EF",
+")(    c #3CDBDA",
+"!(    c #30B3B6",
+"~(    c #40E1E0",
+"{(    c #2DA9AC",
+"](    c #3EDAD8",
+"^(    c #4BF3EE",
+"/(    c #54FBF5",
+"((    c #54FAF5",
+"_(    c #55FAF5",
+":(    c #53FAF5",
+"<(    c #54F9F5",
+"[(    c #56FAF5",
+"}(    c #55F9F5",
+"|(    c #45ECE8",
+"1(    c #37C8C9",
+"2(    c #33BDC0",
+"3(    c #43E7E3",
+"4(    c #4EF6F2",
+"5(    c #4CF5F1",
+"6(    c #40E1DD",
+"7(    c #38CBCC",
+"8(    c #46EEE9",
+"9(    c #56FBF5",
+"0(    c #55FAF6",
+"a(    c #47F1EE",
+"b(    c #3BD5D5",
+"c(    c #35C0C2",
+"d(    c #44E8E6",
+"e(    c #4FF7F2",
+"f(    c #32B4B6",
+"g(    c #41E2DF",
+"h(    c #50F7F2",
+"i(    c #58FBF6",
+"j(    c #56FBF6",
+"k(    c #58FAF5",
+"l(    c #57FBF6",
+"m(    c #56F9F5",
+"n(    c #57FAF5",
+"o(    c #56FAF6",
+"p(    c #58FBF5",
+"q(    c #52F7F3",
+"r(    c #44E7E4",
+"s(    c #34BEBF",
+"t(    c #38C9CA",
+"u(    c #45EDE8",
+"v(    c #53F9F3",
+"w(    c #57FAF6",
+"x(    c #58FAF6",
+"y(    c #57FBF5",
+"z(    c #4CF3EE",
+"A(    c #3EDAD9",
+"B(    c #3CD6D4",
+"C(    c #53F9F4",
+"D(    c #48EFEA",
+"E(    c #39CECE",
+"F(    c #39CCCD",
+"G(    c #47EFEA",
+"H(    c #35C0C1",
+"I(    c #46E9E5",
+"J(    c #53F8F3",
+"K(    c #59FBF5",
+"L(    c #59FBF6",
+"M(    c #5AFBF6",
+"N(    c #5AFBF7",
+"O(    c #5BFCF7",
+"P(    c #5BFBF6",
+"Q(    c #58FBF7",
+"R(    c #52F8F2",
+"S(    c #40E1DF",
+"T(    c #3CD4D2",
+"U(    c #4DF1ED",
+"V(    c #5AFCF7",
+"W(    c #59FBF7",
+"X(    c #59FCF7",
+"Y(    c #59FAF5",
+"Z(    c #4DF2ED",
+"`(    c #3BD3D2",
+" _    c #30AFB2",
+"._    c #40DFDD",
+"+_    c #51F6F1",
+"@_    c #5BFBF7",
+"#_    c #55F9F4",
+"$_    c #46EBE7",
+"%_    c #36C3C5",
+"&_    c #3CD5D4",
+"*_    c #4EF3EF",
+"=_    c #39CDCC",
+"-_    c #4AEFEB",
+";_    c #5DFCF8",
+">_    c #5CFCF7",
+",_    c #5EFCF8",
+"'_    c #5CFCF8",
+")_    c #5FFCF8",
+"!_    c #60FDF8",
+"~_    c #4FF4F0",
+"{_    c #3FDBD9",
+"]_    c #2FAAAE",
+"^_    c #3FDCDA",
+"/_    c #4FF4EF",
+"(_    c #5EFCF7",
+"__    c #5EFDF8",
+":_    c #4BEFEA",
+"<_    c #39CBCC",
+"[_    c #34BCBE",
+"}_    c #45E8E4",
+"|_    c #56F9F4",
+"1_    c #5DFCF7",
+"2_    c #5DFDF7",
+"3_    c #54F9F3",
+"4_    c #45E5E1",
+"5_    c #34BABB",
+"6_    c #30AEB0",
+"7_    c #41DFDD",
+"8_    c #51F5F1",
+"9_    c #3ED7D6",
+"0_    c #50F4EF",
+"a_    c #5CFBF7",
+"b_    c #61FDF8",
+"c_    c #62FDF8",
+"d_    c #5FFDF8",
+"e_    c #60FCF8",
+"f_    c #4CF1EC",
+"g_    c #3BD2D1",
+"h_    c #33B7B9",
+"i_    c #56F8F4",
+"j_    c #5BFAF5",
+"k_    c #48EAE6",
+"l_    c #35BFC1",
+"m_    c #39C9C9",
+"n_    c #49EDEA",
+"o_    c #5CFAF5",
+"p_    c #61FCF8",
+"q_    c #5CFBF6",
+"r_    c #54F7F2",
+"s_    c #42DFDD",
+"t_    c #32B9BA",
+"u_    c #45E5E2",
+"v_    c #58F9F4",
+"w_    c #31AFB1",
+"x_    c #43E1DF",
+"y_    c #55F8F3",
+"z_    c #64FDF8",
+"A_    c #62FEF8",
+"B_    c #63FEF9",
+"C_    c #63FEF8",
+"D_    c #63FDF9",
+"E_    c #63FDF8",
+"F_    c #64FEF9",
+"G_    c #5CFBF5",
+"H_    c #4CEFEA",
+"I_    c #3ACAC9",
+"J_    c #37C3C4",
+"K_    c #48EBE7",
+"L_    c #5BFAF6",
+"M_    c #62FDF9",
+"N_    c #62FEF9",
+"O_    c #57F9F4",
+"P_    c #44E3E1",
+"Q_    c #4FF3EE",
+"R_    c #5EFBF6",
+"S_    c #64FEF8",
+"T_    c #53F5F0",
+"U_    c #3FD8D6",
+"V_    c #34C3C3",
+"W_    c #4AEEE9",
+"X_    c #5FFCF6",
+"Y_    c #35BCBD",
+"Z_    c #47E8E5",
+"`_    c #5DFAF4",
+" :    c #68FEF9",
+".:    c #66FEF9",
+"+:    c #65FEF9",
+"@:    c #67FEF9",
+"#:    c #65FDF9",
+"$:    c #65FEF8",
+"%:    c #66FEF8",
+"&:    c #63FCF8",
+"*:    c #69FEF9",
+"=:    c #64FDF9",
+"-:    c #5FFBF5",
+";:    c #48EAE5",
+">:    c #36C0C0",
+",:    c #3BD0CF",
+"':    c #51F2EE",
+"):    c #62FCF7",
+"!:    c #68FEF8",
+"~:    c #65FDF8",
+"{:    c #57F7F2",
+"]:    c #30A9AD",
+"^:    c #41DEDB",
+"/:    c #59F7F1",
+"(:    c #62FCF8",
+"_:    c #66FDF9",
+"::    c #66FDF8",
+"<:    c #62FBF6",
+"[:    c #4EF1ED",
+"}:    c #38CECE",
+"|:    c #53F3ED",
+"1:    c #64FCF7",
+"2:    c #3BC9C8",
+"3:    c #55EFEA",
+"4:    c #6BFCF7",
+"5:    c #76FFFA",
+"6:    c #72FFFA",
+"7:    c #6BFEF9",
+"8:    c #72FEF9",
+"9:    c #74FFFA",
+"0:    c #6EFEF9",
+"a:    c #6BFFFA",
+"b:    c #6DFEFA",
+"c:    c #70FFF9",
+"d:    c #70FFFA",
+"e:    c #6CFEF9",
+"f:    c #71FEFA",
+"g:    c #74FEFA",
+"h:    c #6EFFFA",
+"i:    c #75FEF9",
+"j:    c #73FFFA",
+"k:    c #74FFF9",
+"l:    c #63FAF5",
+"m:    c #48E5E2",
+"n:    c #46DCDA",
+"o:    c #5FF7F2",
+"p:    c #6AFEF9",
+"q:    c #71FFFA",
+"r:    c #6FFEF9",
+"s:    c #6CFFF9",
+"t:    c #6EFFF9",
+"u:    c #71FEF9",
+"v:    c #70FEF9",
+"w:    c #6DFFF9",
+"x:    c #70FEFA",
+"y:    c #6CFFFA",
+"z:    c #6AFEFA",
+"A:    c #6EFDF8",
+"B:    c #5DF5EF",
+"C:    c #42D6D3",
+"D:    c #35B7B9",
+"E:    c #4EE7E2",
+"F:    c #60F9F4",
+"G:    c #76FEFA",
+"H:    c #72FEFA",
+"I:    c #6FFEFA",
+"J:    c #6DFEF9",
+"K:    c #6FFFFA",
+"L:    c #68FDF6",
+"M:    c #53EEEA",
+"N:    c #39C6C6",
+"O:    c #1D9A9D",
+"P:    c #48DFDB",
+"Q:    c #64F9F3",
+"R:    c #41D4D1",
+"S:    c #66F3EE",
+"T:    c #77FEF8",
+"U:    c #79FFFA",
+"V:    c #78FFFA",
+"W:    c #77FFFA",
+"X:    c #77FFF9",
+"Y:    c #7AFFFA",
+"Z:    c #75FFFA",
+"`:    c #76FEF9",
+" <    c #78FEF9",
+".<    c #6AF8F2",
+"+<    c #4BDEDB",
+"@<    c #35B3B4",
+"#<    c #50E4E0",
+"$<    c #6CFAF4",
+"%<    c #75FEFA",
+"&<    c #77FEF9",
+"*<    c #76FEF8",
+"=<    c #5FF1EB",
+"-<    c #3DCDCB",
+";<    c #3CC5C4",
+"><    c #5AEDE8",
+",<    c #75FCF6",
+"'<    c #7BFFFA",
+")<    c #78FFF9",
+"!<    c #6FFCF6",
+"~<    c #56EAE5",
+"{<    c #20A6A7",
+"]<    c #57E9E4",
+"^<    c #33AAAB",
+"/<    c #4CDDD9",
+"(<    c #6BF7F1",
+"_<    c #73FEF9",
+":<    c #7CFFFA",
+"<<    c #7EFFFA",
+"[<    c #7DFFFA",
+"}<    c #7DFEF8",
+"|<    c #6BF5EF",
+"1<    c #47D6D3",
+"2<    c #3ABFBE",
+"3<    c #5EEBE5",
+"4<    c #78FCF5",
+"5<    c #7AFEF9",
+"6<    c #74FCF5",
+"7<    c #5BECE7",
+"8<    c #39C2C1",
+"9<    c #45CFCC",
+"0<    c #5EF1EC",
+"a<    c #7FFFFA",
+"b<    c #76FFF9",
+"c<    c #72FAF4",
+"d<    c #52E4DE",
+"e<    c #28B9B8",
+"f<    c #3AB6B4",
+"g<    c #5EE6E0",
+"h<    c #7CFAF4",
+"i<    c #82FEF9",
+"j<    c #84FFFA",
+"k<    c #81FFFA",
+"l<    c #85FFFA",
+"m<    c #82FFFA",
+"n<    c #83FFFA",
+"o<    c #80FFFA",
+"p<    c #83FEF9",
+"q<    c #6BF1EB",
+"r<    c #44CCCA",
+"s<    c #42CCC9",
+"t<    c #68EFEA",
+"u<    c #80FDF7",
+"v<    c #82FFF9",
+"w<    c #7AFAF4",
+"x<    c #61E7E2",
+"y<    c #50DAD6",
+"z<    c #78F7F1",
+"A<    c #81FEF9",
+"B<    c #81FFF9",
+"C<    c #76F7F2",
+"D<    c #53DCD8",
+"E<    c #45C4C2",
+"F<    c #6AEDE8",
+"G<    c #86FCF7",
+"H<    c #8DFFFA",
+"I<    c #87FFFA",
+"J<    c #8BFFFA",
+"K<    c #88FFFA",
+"L<    c #8AFFFA",
+"M<    c #89FFFA",
+"N<    c #8CFFFA",
+"O<    c #83FCF6",
+"P<    c #70ECE6",
+"Q<    c #44C2C0",
+"R<    c #55D6D2",
+"S<    c #7CF4EF",
+"T<    c #8AFDF9",
+"U<    c #8FFFFA",
+"V<    c #8CFEF9",
+"W<    c #80F9F4",
+"X<    c #59E0DC",
+"Y<    c #3BB1B1",
+"Z<    c #5FE3DE",
+"`<    c #84FAF5",
+" [    c #86FFFA",
+".[    c #8EFFFA",
+"+[    c #8AFFFB",
+"@[    c #87FEF8",
+"#[    c #76F3ED",
+"$[    c #4BD1CE",
+"%[    c #4FD0CD",
+"&[    c #75F3ED",
+"*[    c #84FEF9",
+"=[    c #86FAF4",
+"-[    c #61E5DF",
+";[    c #3AACAB",
+">[    c #59E0DB",
+",[    c #7FF8F2",
+"'[    c #85FEF9",
+")[    c #7CF6F0",
+"![    c #56D8D4",
+"~[    c #44BEBD",
+"{[    c #69EBE5",
+"][    c #85FCF6",
+"^[    c #87FFFB",
+"/[    c #7FFCF8",
+"([    c #74EEE8",
+"_[    c #44C6C5",
+":[    c #57DAD6",
+"<[    c #83F6F1",
+"[[    c #88FEF9",
+"}[    c #90FFFA",
+"|[    c #94FFFA",
+"1[    c #92FFFB",
+"2[    c #91FFFA",
+"3[    c #83F7F1",
+"4[    c #59DED9",
+"5[    c #41B9B8",
+"6[    c #70E8E2",
+"7[    c #88FBF5",
+"8[    c #93FFFA",
+"9[    c #92FFFA",
+"0[    c #8EFEF8",
+"a[    c #74F1EC",
+"b[    c #4CCEC9",
+"c[    c #47CCC8",
+"d[    c #79F1EB",
+"e[    c #8DFDF8",
+"f[    c #90FFFB",
+"g[    c #86FFF9",
+"h[    c #87FBF5",
+"i[    c #6BE9E4",
+"j[    c #40B1AF",
+"k[    c #71E4DE",
+"l[    c #8EFAF4",
+"m[    c #98FFFA",
+"n[    c #96FFFA",
+"o[    c #98FFFB",
+"p[    c #95FFFA",
+"q[    c #9AFFFA",
+"r[    c #97FFFA",
+"s[    c #99FFFB",
+"t[    c #96FFFB",
+"u[    c #95FFFB",
+"v[    c #96FEF8",
+"w[    c #8AF5EF",
+"x[    c #5DD7D2",
+"y[    c #4EC6C2",
+"z[    c #80EFE8",
+"A[    c #95FEF8",
+"B[    c #97FFFB",
+"C[    c #99FFFA",
+"D[    c #9AFFFB",
+"E[    c #92FDF8",
+"F[    c #7EEDE7",
+"G[    c #4BC2C0",
+"H[    c #61D7D1",
+"I[    c #83F6EF",
+"J[    c #91FEF8",
+"K[    c #94FFFB",
+"L[    c #91FAF4",
+"M[    c #72E5DF",
+"N[    c #4CBEBC",
+"O[    c #7BEAE3",
+"P[    c #94FCF6",
+"Q[    c #9CFFFA",
+"R[    c #9CFFFB",
+"S[    c #9BFFFB",
+"T[    c #9EFFFB",
+"U[    c #9EFFFA",
+"V[    c #9DFFFB",
+"W[    c #9BFFFA",
+"X[    c #93FDF7",
+"Y[    c #86F2EB",
+"Z[    c #5BCFCB",
+"`[    c #60D3CE",
+" }    c #86F4ED",
+".}    c #94FFF9",
+"+}    c #98FBF5",
+"@}    c #75E7E1",
+"#}    c #6BDFD9",
+"$}    c #90F7F2",
+"%}    c #9BFEFA",
+"&}    c #9FFFFB",
+"*}    c #90F7F1",
+"=}    c #68DDD7",
+"-}    c #57C9C4",
+";}    c #88F0E9",
+">}    c #9AFDF7",
+",}    c #9FFFFA",
+"'}    c #A0FFFB",
+")}    c #A1FFFB",
+"!}    c #9BFDF8",
+"~}    c #85EEE8",
+"{}    c #66DCD7",
+"]}    c #90F8F1",
+"^}    c #95F9F2",
+"/}    c #73E1DC",
+"(}    c #48B8B5",
+"_}    c #7EE6E0",
+":}    c #97FBF5",
+"<}    c #9FFEFA",
+"[}    c #A0FFFA",
+"}}    c #9DFFFA",
+"|}    c #9DFEF9",
+"1}    c #8FF5EF",
+"2}    c #63D4CE",
+"3}    c #61D3CE",
+"4}    c #91F3ED",
+"5}    c #9EFDF8",
+"6}    c #A1FFFA",
+"7}    c #A3FFFB",
+"8}    c #A4FFFB",
+"9}    c #A2FFFB",
+"0}    c #A3FFFA",
+"a}    c #A2FFFA",
+"b}    c #9BFBF6",
+"c}    c #80E8E2",
+"d}    c #46B2B0",
+"e}    c #79E5DE",
+"f}    c #99FAF4",
+"g}    c #A0FEFA",
+"h}    c #9FFEF9",
+"i}    c #93F6EF",
+"j}    c #69D9D3",
+"k}    c #55C5C0",
+"l}    c #85EDE6",
+"m}    c #9AFCF6",
+"n}    c #9CFEF8",
+"o}    c #57C9C5",
+"p}    c #76DDD7",
+"q}    c #9CF8F3",
+"r}    c #A8FFFB",
+"s}    c #A7FFFB",
+"t}    c #A6FFFB",
+"u}    c #A5FFFB",
+"v}    c #A9FFFB",
+"w}    c #A7FFFA",
+"x}    c #9BF9F3",
+"y}    c #77DFD9",
+"z}    c #55C0BB",
+"A}    c #8AEBE4",
+"B}    c #A1FCF6",
+"C}    c #A6FFFA",
+"D}    c #A4FFFA",
+"E}    c #A2FDF8",
+"F}    c #91F2EB",
+"G}    c #67D0C9",
+"H}    c #63CFC9",
+"I}    c #94F2EB",
+"J}    c #A4FEF9",
+"K}    c #97FCF6",
+"L}    c #88EAE2",
+"M}    c #4AB6B2",
+"N}    c #87E7E1",
+"O}    c #A1FCF5",
+"P}    c #ABFFFC",
+"Q}    c #ABFFFB",
+"R}    c #AAFFFB",
+"S}    c #ACFFFC",
+"T}    c #AAFFFC",
+"U}    c #A9FFFC",
+"V}    c #A4FFF9",
+"W}    c #94F5EF",
+"X}    c #6FD6D0",
+"Y}    c #64CDC7",
+"Z}    c #93F1EA",
+"`}    c #A2FEF8",
+" |    c #ADFFFC",
+".|    c #ACFFFB",
+"+|    c #A7FDF7",
+"@|    c #8EEDE7",
+"#|    c #5FC5BF",
+"$|    c #74DAD4",
+"%|    c #9EF8F1",
+"&|    c #A8FFFC",
+"*|    c #9FFAF4",
+"=|    c #84E2DC",
+"-|    c #5EC3BF",
+";|    c #94EEE8",
+">|    c #A9FEF7",
+",|    c #ADFFFB",
+"'|    c #AEFFFB",
+")|    c #AEFFFC",
+"!|    c #A9FDF9",
+"~|    c #9AF1EA",
+"{|    c #67CEC8",
+"]|    c #73D6D0",
+"^|    c #9DF5EF",
+"/|    c #A9FFFA",
+"(|    c #A6FCF6",
+"_|    c #89E8E1",
+":|    c #80E4DD",
+"<|    c #A0FAF3",
+"[|    c #AAFFFA",
+"}|    c #9DF7F1",
+"||    c #7FDCD5",
+"1|    c #6DCFCA",
+"2|    c #9DF3EC",
+"3|    c #ABFDF8",
+"4|    c #B0FFFC",
+"5|    c #AFFFFB",
+"6|    c #B1FFFB",
+"7|    c #AFFFFC",
+"8|    c #B2FFFC",
+"9|    c #B1FFFC",
+"0|    c #AAFCF7",
+"a|    c #95ECE6",
+"b|    c #88DFD8",
+"c|    c #A4F9F2",
+"d|    c #AEFFFA",
+"e|    c #B0FFFB",
+"f|    c #B2FFFB",
+"g|    c #A6F9F3",
+"h|    c #80E1DA",
+"i|    c #58BEB8",
+"j|    c #91EBE3",
+"k|    c #ACFFFA",
+"l|    c #9CF4ED",
+"m|    c #75D3CD",
+"n|    c #77D9D3",
+"o|    c #A1F6EF",
+"p|    c #ACFEF9",
+"q|    c #B3FFFC",
+"r|    c #B4FFFC",
+"s|    c #A8FBF5",
+"t|    c #8EE7E1",
+"u|    c #59B7B3",
+"v|    c #90E6E0",
+"w|    c #A9FCF6",
+"x|    c #ABFFFA",
+"y|    c #A7F7F0",
+"z|    c #78D8D1",
+"A|    c #6FC9C3",
+"B|    c #97F1EA",
+"C|    c #A9FDF7",
+"D|    c #B3FEFC",
+"E|    c #B3FFFB",
+"F|    c #A9FEF8",
+"G|    c #98F0E9",
+"H|    c #66CAC5",
+"I|    c #8BE1DB",
+"J|    c #A8FAF3",
+"K|    c #B6FEFA",
+"L|    c #B4FFFB",
+"M|    c #B5FFFC",
+"N|    c #B5FFFB",
+"O|    c #B6FFFC",
+"P|    c #B9FFFC",
+"Q|    c #B7FFFC",
+"R|    c #B2FEFA",
+"S|    c #AAF9F3",
+"T|    c #8AE0DA",
+"U|    c #65C5BF",
+"V|    c #9CEFE6",
+"W|    c #B0FDF7",
+"X|    c #B3FEFA",
+"Y|    c #A2F2EB",
+"Z|    c #74CEC7",
+"`|    c #79D4CD",
+" 1    c #A0F4ED",
+".1    c #B2FDF9",
+"+1    c #B8FFFC",
+"@1    c #AFFCF6",
+"#1    c #96EBE4",
+"$1    c #60BAB6",
+"%1    c #93E8E1",
+"&1    c #AEFBF5",
+"*1    c #B5FEFA",
+"=1    c #A3F6EF",
+"-1    c #7AD7D1",
+";1    c #73CFC9",
+">1    c #A2F3EC",
+",1    c #B4FEF8",
+"'1    c #AFFCF7",
+")1    c #9BECE5",
+"!1    c #88DED5",
+"~1    c #A3F7F0",
+"{1    c #B2FEF9",
+"]1    c #A9FAF4",
+"^1    c #8FE4DD",
+"/1    c #6DC6C0",
+"(1    c #9FEEE7",
+"_1    c #B2FDF7",
+":1    c #BAFFFC",
+"<1    c #B9FFFB",
+"[1    c #B6FEF9",
+"}1    c #A6F1E9",
+"|1    c #74CDC7",
+"11    c #85DAD3",
+"21    c #ACF7F0",
+"31    c #B7FEFA",
+"41    c #B6FFFB",
+"51    c #B1FAF4",
+"61    c #95E6DF",
+"71    c #61B6B2",
+"81    c #94E5DE",
+"91    c #AFFBF4",
+"01    c #B4FEFA",
+"a1    c #A8F8F1",
+"b1    c #86DCD4",
+"c1    c #7FD3CC",
+"d1    c #A9F2EC",
+"e1    c #BCFFFC",
+"f1    c #BBFFFC",
+"g1    c #B8FFFB",
+"h1    c #B6FCF6",
+"i1    c #9FEBE4",
+"j1    c #8FE3DB",
+"k1    c #B1FAF3",
+"l1    c #BAFEFA",
+"m1    c #BDFFFC",
+"n1    c #AFF8F2",
+"o1    c #91E0D8",
+"p1    c #6FC3BB",
+"q1    c #A0ECE5",
+"r1    c #B7FDF7",
+"s1    c #BAFFFB",
+"t1    c #B8FFF9",
+"u1    c #AAF4EC",
+"v1    c #80D2CB",
+"w1    c #89D6CF",
+"x1    c #ACF4ED",
+"y1    c #BCFEFA",
+"z1    c #BEFFFC",
+"A1    c #BFFFFC",
+"B1    c #BEFFFB",
+"C1    c #B8FBF6",
+"D1    c #9EE7E0",
+"E1    c #64B7B1",
+"F1    c #9AE5DE",
+"G1    c #B5FAF3",
+"H1    c #BBFFFA",
+"I1    c #B9FEFA",
+"J1    c #AFF7F0",
+"K1    c #8DDAD3",
+"L1    c #77C8C1",
+"M1    c #A6EFE8",
+"N1    c #B6FCF7",
+"O1    c #BBFDF9",
+"P1    c #A8F0E9",
+"Q1    c #7CCDC5",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                          .                                                                                                                                                                                                                                                                                                                                                                                                                                     ",
+"                                                                                          + @                                                                                                                                                                                                                                                                                                                                                                                                                                   ",
+"                                                                                          # $ %                                                                                                                                                                                                                                                                                                                                                                                                                                 ",
+"                                                                                          & * =                                                                                                                                                                                                                                                                                                                                                                                                                                 ",
+"                                                                                          - ; > ,                                                                                                                                                                                                                                                                                                                                                                                                                               ",
+"                                                                                        ' ) ! ~ { *                                                                                                                                                                                                                                                                                                                                                                                                                             ",
+"                                                                                        ] ^ / ( _ : <                                                                                                                                                                                                                                                                                                                                                                                                                           ",
+"                                                                                        [ } > | | ~ 1 2                                                                                                                                                                                                                                                                                                                                                                                                                         ",
+"                                                                                        @ 3 _ | | | 4 ;                                                                                                                                                                                                                                                                                                                                                                                                                         ",
+"                                                                                        5 , 4 | | | 6 7 8                                                                                                                                                                                                                                                                                                                                                                                                                       ",
+"                                                                                        9 ; 0 a a a a a ( ,                                                                                                                                                                                                                                                                                                                                                                                                                     ",
+"                                                                                        b c 6 a a a a a 6 d *                                                                                                                                                                                                                                                                                                                                                                                                                   ",
+"                                                                                        e { a f f f f f g h { i                                                                                       j [ k 5 5 @ l                                                                                                                                                                                                                                                                                                             ",
+"                                                                                      m n o a g g g f f f f 6 :                                                                                         5 < p q r s t u % v w k x [                                                                                                                                                                                                                                                                                             ",
+"                                                                                      y z ( A B C A A A A A D 6 /                                                                                         E d | | F ~ G d : c H , p z I t % J K L x                                                                                                                                                                                                                                                                             ",
+"                                                                                      @ = | C A A A A A A A A D 6 1                                                                                         1 M N C D g D f f h 6 O 4 _ o G / 1 P = * Q < $ R w k 5 @                                                                                                                                                                                                                                                           ",
+"                                                                                      5 8 S A A T A A T T A A A A ( U                                                                                       e : S C A A T A A T V T V A g g B a 6 | W ( ~ d X ! 1 Y Z * t                                                                                                                                                                                                                                                       ",
+"                                                                                      ` 1 B  .T T ..T T T  .T T ..C ~                                                                                         I o D ..T ....+.V +.T T T  .....@...T T A A #.A D B f h $.d p                                                                                                                                                                                                                                                     ",
+"                                                                                      % > %.&.@. .*. . .@.=. . .*.-.;.>.                                                                                        ,.0 +.*.*.*.*...*.@. . .*.*.@.*.*. .*. .*.&.&.@.*. .@...#.( '.                                                                                                                                                                                                                                                  ",
+"                                                                                      ).>.+.*.*.*.*.*.*.*.*.*.*.*.*.-.!.~.                                                                                        {.6 +.*.*.*.*.&.].*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.C ^.                                                                                                                                                                                                                                                  ",
+"                                                                                      < O @././././.(.(._./.(./.(.(./.].:./                                                                                         { D ].(./.(./.(./.(.(./.(./.(.(.(.(./.(._.(.(.(.(.(./.].C <.                                                                                                                                                                                                                                                ",
+"                                                                                      Q 6 [./././.(./.(././.(.(./.(./.(.[.h 1                                                                                       z ~ T ]././.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(.(.(.(.(.(.].B :                                                                                         }.                                                                                                                                                    ",
+"                                                                                    |.Z f (._.1.1._.2._.2.1._.1.1._.1._._.@.6                                                                                         U 6 @.1.1.1.1.2._.1._._.1.1.1.1.1._.1._._._.2.1.1.1.1.1.&.f 3.                                                                                      y - I z ^ $ $ J w                                                                                                                                     ",
+"                                                                                    4.5.C 2.1.2.6._.1.2._.1.1._.6.2.2.2._.1.7.~                                                                                         ; f (.6.2._.2._.1.1.8.2.6.1.2.2.1.6.1.6.6.2.1.6._.2.2.1.].9.P                                                                                       e / $.h ( o G 3.8 P p Q I t % 9 &                                                                                                                   ",
+"                                                                                    ` : @.0.a.a.0.2.a.a.2.b.6.b.0.0.b.a.2.a.a.+.4                                                                                         { T a.a.2.0.c.a.d.6.0.0.b.a.6.d.a.6.a.0.d.a.0.b.6.0.6.b.].|                                                                                         ; g (.(.[.e.@.+.T D f.h W g.{ ! P 8 = Q i e h.w i.                                                                                                ",
+"                                                                                    - j.].k.l.a.0.k.k.k.0.k.a.a.a.k.a.0.k.k.m.b...d                                                                                         4 ].a.m.k.0.m.k.a.a.m.0.a.0.k.k.0.a.a.k.a.a.k.m.m.0.k.k.&.(                                                                                         d T 6.m.a.k.a.6.0.6.6././.e. .7.T n.a O ^.d X : 1 ,.3 n $ R                                                                                     ",
+"                                                                                    $ ( _.m.k.k.a.m.k.k.m.k.m.k.k.k.m.k.m.0.m.k.6.A !                                                                                       = a 1.k.k.k.m.m.k.k.m.m.k.m.0.k.m.k.a.m.k.0.k.k.m.k.m.m.0.o.j.                                                                                        _ ].k.0.m.k.0.m.k.p.k.m.m.k.k.k.a.6.6._.(.].*...A D h O _ 3.                                                                                  ",
+"                                                                                    I h q.r.s.r.t.k.r.r.m.m.u.m.u.u.r.m.m.m.u.s.u.b.D                                                                                         ; D 1.r.m.u.t.m.r.u.u.v.k.k.r.r.r.r.m.u.u.m.k.u.m.k.r.r.k. .>                                                                                       U h (.k.r.m.u.m.m.u.m.k.r.m.r.u.r.s.u.t.u.k.m.m.m.0.0.2.8...d                                                                                 ",
+"                                                                                    Q B q.t.t.r.u.u.u.u.t.u.u.t.r.r.t.r.u.u.u.u.t.u.2.f.                                                                                        {  .m.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.r.r.u.u.u.r.w.#.                                                                                        1 C 0.u.t.r.u.r.u.t.r.u.u.u.u.r.u.u.u.u.t.u.u.u.u.u.u.u.q. .{                                                                               ",
+"                                                                                    P C s.u.v.t.r.t.t.t.u.u.u.u.u.u.t.r.u.u.u.u.r.u.r.x.(                                                                                         ^.x.m.t.u.t.u.u.u.t.u.r.t.u.t.u.r.t.u.t.u.u.u.t.r.u.u.s.c.f                                                                                         >  .m.t.t.u.r.u.u.u.u.u.u.u.r.t.u.r.u.u.u.u.t.t.u.u.u.t.0.#.                                                                              ",
+"                                                                                  k ! ..y.t.t.z.t.A.t.A.z.B.t.t.t.t.t.t.t.t.z.t.C.t.B.t.].~                                                                                         f.b.D.B.t.t.t.t.B.t.t.z.t.A.t.t.E.B.A.B.z.t.z.t.t.t.B.t.8.0                                                                                         ~ (.v.z.u.B.z.B.z.z.t.z.t.t.t.t.t.t.t.t.t.A.A.B.u.z.z.F.0.n.                                                                            ",
+"                                                                                  ` d 8.z.G.G.H.G.A.z.G.E.A.H.z.z.H.H.G.z.z.H.G.G.G.H.G.v...{                                                                                       H V 0.I.H.z.H.H.H.z.z.E.G.G.z.G.G.H.A.z.H.G.A.H.G.z.H.H.A._.~                                                                                         f.0.z.B.H.H.H.z.E.G.z.H.H.z.H.G.H.z.z.G.G.H.A.G.H.H.G.B.0.J.                                                                          ",
+"                                                                                  - >.c.K.K.K.K.K.G.H.K.K.G.K.z.H.K.K.K.H.H.K.K.K.K.K.K.H.r.L.                                                                                        > *.A.G.H.K.K.K.H.H.K.K.K.H.K.K.K.K.H.K.K.G.K.G.H.K.K.K.t.&.<.                                                                                      ; +.s.G.K.K.K.H.K.K.H.K.H.G.K.K.K.H.H.K.K.K.G.K.K.K.K.I.M.b.O                                                                         ",
+"                                                                                    d 2.N.O.P.Q.O.P.Q.R.N.O.O.K.O.Q.S.N.P.O.O.O.O.P.P.O.O.O.r.#.                                                                                        W a.G.S.P.O.K.O.P.P.O.O.P.O.O.P.O.P.O.K.O.P.N.S.O.O.K.O.A.[.                                                                                        : /.z.P.T.N.P.O.N.O.O.S.N.P.O.K.O.Q.O.O.P.O.P.O.O.P.P.S.G.1.^.                                                                      ",
+"                                                                                    , V t.O.O.O.O.O.Q.P.Q.P.O.P.O.P.O.Q.O.O.P.O.P.O.P.O.O.O.N.m.f.                                                                                        g y.N.O.O.O.O.O.P.O.P.O.O.O.P.P.O.O.P.P.P.O.O.P.O.P.O.N.v.V                                                                                         U.6.H.O.P.P.O.O.P.O.Q.P.Q.O.O.P.O.P.O.P.O.O.O.P.Q.O.O.N.z.].                                                                      ",
+"                                                                                      G V.H.O.P.W.P.W.P.Q.P.O.P.O.O.P.W.W.W.X.W.W.P.Q.X.W.O.W.R.b.O                                                                                         T B.O.W.X.W.X.W.X.W.Q.P.X.X.Q.X.P.X.P.Q.O.O.Q.P.X.W.W.Q.v.B                                                                                         S r.O.Q.Q.X.X.O.O.P.O.O.X.X.W.X.X.W.X.W.Q.X.Q.Q.P.P.X.Y.B...                                                                    ",
+"                                                                                        ( d.H.X.W.X.X.X.X.X.W.Q.Z.Q.W.X.X.X.X.O.W.X.P.X.X.X.W.Q.`.1.                                                                                        : /.H.X.W.X.X.X.P.Q.X.P.Q.W.X.X.W.X.X.W.W.W.Q.W.X.W.X.X.N.0.6                                                                                         A B.P.X.X.X.W.W.W.W.W.W.X.X.X.X.Q. +X.P.T.W.X.X.X.X.X.P.B.N                                                                   ",
+"                                                                                          g t.P..+Z.W.Z.W.W.W..+++@+X.Z.W.Z.W..+W.Z..+W.W.W.W.W.W.H.*.                                                                                        U.b.N.Z.Z.W.W..+X.W..+#+W.Z.Z.W.W.Z.W.W.++#+X.Z.Z.W.Z.Z.N.a.U.                                                                                      : [.K.W..+W.Z.Z.W.Z.++X.W.W.W.W.#+X.W..+.+W.W.W.W.Z.W..+O.v.f.                                                                ",
+"                                                                                            +.A..+++.+++++++Z.++++.+Z..+++.+++++$+++++W.++++++$+++Z.M.+.                                                                                        a r. +++++++++Z.++++.+Z.++.+.+++++$+++++++Z.++++++++++Z.S._.                                                                                        _ b.Q.$+++++.+Z.++++Z.++++++++++W.$+++++Z.++++++++++++.+T.q.W                                                               ",
+"                                                                                            / /.Y.%+&+*+&+*+&+&+%+&+*+$+*+=+++%+-+*+$+*+*+*+*+&+*+&+%+G.D                                                                                         #.A..+-+%+++&+&+*+%+&+&+;+=+*+*+&+*+%+*+&+.+%+&+%+++&+=+H.[.                                                                                        f.v..+&+*+=+*+>+%+&+%+++&+*+$+*+*+*+%+&+&+&+&+&+&+*+*+%+O.d.                                                              ",
+"                                                                                              ~ l.W.;+-+&+-+&+-+&+&+-+&+-+-+&+-+-+&+&+-+&+-+-+&+&+-+-+.+r.h                                                                                       : e.O.&+-+-+-+-+&+-+-+&+-+&+-+-+&+-+&+&+-+&+-+&+-+&+&+-+%+N.V                                                                                         +.`.;+-+-+&+-+-+&+&+&+-+-+&+-+&+&+-+&+-+&+-+&+-+-+&+-+&+O.e.                                                            ",
+"                                                                                                f B.#+-+,+'+&+)+)+,+!+!+,+)+&+~+)+)+)+)+)+)+&+&+,+!+&+)+++q.                                                                                        o a.;+!+,+)+)+)+)+)+)+~+-+!+{+&+,+)+)+!+{+!+]+!+-+)+)+)+^+G.B                                                                                         ].O.,+!+~+)+)+)+!+-+)+,+!+)+)+)+)+)+)+{+-+&+)+&+!+)+]+*+S.T                                                           ",
+"                                                                                                  +.K.~+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+{+#+2.                                                                                        h B.^+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+>+m.                                                                                        >.0.%+/+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+^+G.B                                                         ",
+"                                                                                                    /. +/+)+)+)+)+)+)+)+)+]+)+)+]+)+)+)+)+)+)+)+)+)+)+)+)+)+ +&.                                                                                        T K./+(+)+)+)+)+)+)+)+)+)+)+)+)+]+)+)+)+)+)+)+)+)+)+)+_+.+b.                                                                                        h t.>+)+)+)+)+)+)+]+)+)+]+)+)+)+)+]+]+)+)+)+)+)+)+)+)+)+*+v.6                                                       ",
+"                                                                                                    d w.>+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+(+(+(+(+(+(+(+(+(+)+O.T                                                                                         (.W.)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+W.x.                                                                                        A K.{+<+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+(+(+(+(+(+(+(+:+(+*+k.                                                      ",
+"                                                                                                      6 G.)+[+(+[+[+[+[+[+[+}+[+<+<+<+|+1+[+}+}+[+}+[+:+[+[+|+)+N.g                                                                                       o 0.>+(+<+<+<+<+[+[+[+[+[+<+<+[+}+[+<+[+[+[+[+<+<+<+<+<+:+2+*.                                                                                        (. +)+3+[+[+[+}+4+}+[+<+<+<+<+1+[+[+[+[+[+<+<+[+<+[+[+}+;+6.                                                    ",
+"                                                                                                        T T.(+5+5+5+5+[+[+5+5+5+3+5+5+5+3+[+5+5+5+3+3+4+[+5+5+[+)+B.                                                                                        h A.^+5+5+3+5+3+5+3+3+5+3+5+[+3+5+5+3+[+5+5+5+5+[+[+5+5+1+T.T                                                                                       o b.*+3+5+[+3+[+3+3+5+<+[+5+3+5+5+5+5+[+5+5+5+5+5+[+5+5+5+++(.                                                  ",
+"                                                                                                          (.6+5+7+8+7+8+7+8+7+7+7+8+7+8+8+8+8+8+8+7+8+8+8+8+7+7+9+,+m.                                                                                        A O.<+7+7+8+7+7+7+8+7+7+8+8+7+8+8+8+7+8+8+8+7+8+7+8+7+7+<+H.                                                                                        6 B.)+8+8+8+7+8+8+8+8+8+8+8+7+8+7+7+8+8+8+7+7+8+7+7+7+8+[+ +%.                                                ",
+"                                                                                                          o k.{+9+0+8+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+8+8+7+9+*+6.                                                                                        &.++5+a+7+7+7+7+7+7+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+0+)+b+                                                                                        C  +}+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+7+7+7+7+7+:+K.                                                ",
+"                                                                                                            f.A.[+c+a+a+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+c+c+a+a+c+c+a+>+&.                                                                                        s.d+c+c+c+c+c+c+c+a+a+c+c+a+c+c+c+c+c+c+c+c+c+c+c+c+c+e+)+b.                                                                                        (.^+f+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+a+c+c+7+c+c+c+c+c+[+z.                                              ",
+"                                                                                                              #.Q.8+c+g+c+c+h+c+c+c+c+c+c+c+c+c+g+g+c+g+c+c+g+g+c+c+g+7+.+#.                                                                                      W E.3+c+c+c+c+h+c+g+g+c+c+g+c+c+c+c+c+c+c+c+c+c+c+c+c+g+i+~+(.                                                                                        0.(+c+h+c+c+c+c+c+c+g+g+c+c+c+g+c+g+g+h+c+g+c+c+c+c+g+a+d+y.                                            ",
+"                                                                                                                (.^+e+g+j+k+g+g+g+g+g+l+g+c+g+g+c+g+g+g+g+g+l+g+g+g+g+g+m+N.                                                                                        A X.5+n+g+j+g+l+g+j+j+g+g+g+k+g+g+g+g+g+g+g+c+l+l+g+g+j+a+.+..                                                                                      W H.5+g+g+g+g+j+k+g+l+c+g+l+g+c+g+g+j+j+l+l+g+g+c+g+g+g+a+{+b.                                          ",
+"                                                                                                                  0.(+c+l+o+l+l+p+l+o+o+p+p+g+o+l+l+p+j+o+p+o+j+l+p+p+l+l+5+A.                                                                                        (.~+c+o+p+l+p+g+j+p+p+j+j+o+l+g+o+p+o+o+p+p+g+l+l+l+p+n+0+ +                                                                                        D  +8+l+n+j+l+o+l+l+l+j+l+o+j+l+l+g+l+p+g+g+p+p+g+l+o+q+c+~+].                                        ",
+"                                                                                                                  W G.[+p+p+p+p+p+l+p+o+o+p+p+p+p+p+o+o+p+p+p+p+p+p+p+o+p+j+(+k.                                                                                        0.(+h+p+p+o+j+l+o+o+p+l+p+p+o+o+o+p+p+l+l+l+p+o+p+o+o+g+3+H.                                                                                        @.*+a+l+p+l+l+p+p+o+p+o+l+p+p+l+j+o+l+p+l+l+o+p+p+l+o+p+a+Z.                                        ",
+"                                                                                                                    B  +a+p+l+p+o+o+p+p+o+l+l+o+p+p+p+l+r+s+o+o+p+p+o+p+p+p+g+t+(.                                                                                      4 A.3+j+o+l+p+o+p+o+l+o+l+l+p+p+p+o+q+o+p+l+o+p+o+p+l+p+r+<+b+                                                                                        b./+l+p+o+l+p+o+l+p+l+p+l+p+l+q+o+p+l+o+l+l+o+p+l+p+o+l+9+K.                                      ",
+"                                                                                                                      ].~+l+u+u+u+u+u+u+u+p+u+u+v+r+u+u+u+u+u+u+u+u+u+u+u+u+u+g+*++.                                                                                      D w+a+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+u+u+r+v+u+u+u+u+p+(+b.                                                                                        z.7+s+u+u+u+u+r+r+u+u+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+9+G.                                    ",
+"                                                                                                                        l.3+r+u+u+u+x+x+u+y+u+x+z+u+u+x+x+x+u+u+u+u+x+x+u+u+u+u+k+W.                                                                                        @.~+p+y+x+u+u+u+u+u+x+u+u+u+u+u+x+u+y+u+u+u+z+u+u+u+u+y+o+/+(.                                                                                      f.W.j+y+u+x+u+u+x+u+x+y+u+x+u+x+x+x+u+u+u+u+x+x+x+u+x+y+r+[+w.                                  ",
+"                                                                                                                          H.f+u+x+y+A+x+y+y+y+y+y+A+y+A+y+A+y+y+y+y+y+y+x+y+y+u+x+e+S.                                                                                        8.B+u+A+y+y+y+y+y+y+y+y+u+y+y+x+x+y+y+y+y+y+y+y+y+A+y+y+l+%+                                                                                        @.*+l+A+y+u+y+A+y+y+y+y+y+y+A+A+A+y+y+y+y+x+y+A+y+x+A+y+r+d+&.                                ",
+"                                                                                                                          f W.o+C+D+D+C+C+E+C+E+F+C+C+C+F+y+E+E+E+C+E+E+C+G+E+C+D+A+a+C.                                                                                        z.c+F+C+E+C+E+C+E+D+D+E+E+E+E+C+C+C+C+F+F+E+C+C+A+C+E+C+j+Q.                                                                                        c.}+y+E+C+E+C+C+E+C+C+E+C+C+E+D+C+C+G+D+C+C+D+D+C+C+G+E+r+*+                                ",
+"                                                                                                                            T &+x+E+A+E+D+H+D+D+D+D+H+H+H+D+D+D+D+H+C+I+D+F+A+D+D+H+A+3+0.                                                                                      f.#+q+G+D+H+E+H+H+J+A+D+H+F+E+D+H+D+D+D+D+D+D+H+D+D+D+H+E+e+t.                                                                                        z.e+y+D+D+D+H+D+D+H+D+H+H+H+A+D+D+C+F+E+H+F+F+H+H+H+D+C+p+w+                              ",
+"                                                                                                                              2.K+y+D+H+D+D+D+H+D+H+D+D+D+H+D+D+D+D+D+D+D+H+D+H+D+D+H+x+d+                                                                                        T t+r+D+D+D+D+H+D+D+H+D+D+H+D+D+D+D+D+H+D+D+H+D+D+D+D+H+F+9+k.                                                                                      h X.g+C+H+H+D+H+D+H+D+D+D+H+D+D+H+H+D+D+D+D+D+H+D+D+H+D+C+c+S.                            ",
+"                                                                                                                                z.c+E+L+M+M+M+M+L+L+L+M+M+M+L+M+M+M+L+M+M+L+M+M+M+M+M+H+s+*+                                                                                        2.[+A+M+M+M+M+M+M+M+M+M+M+L+M+M+M+L+M+M+L+L+M+M+M+M+M+L+A+}+1.                                                                                      7.!+s+L+L+L+L+M+M+M+M+L+M+M+L+M+M+M+M+M+M+L+M+M+M+L+M+M+C+0+r.                          ",
+"                                                                                                                                   +o+L+M+N+M+L+M+M+M+L+M+M+M+M+L+M+M+L+L+M+L+L+M+L+M+M+O+o+ +                                                                                        t.0+C+M+M+L+M+L+M+M+M+M+M+P+M+L+M+L+L+M+M+L+L+L+M+M+M+H+s+!+                                                                                        _.B+C+M+M+M+M+M+L+M+L+M+M+M+M+L+M+L+L+M+L+L+M+M+M+M+Q+L+C+K+_.                        ",
+"                                                                                                                                  A t+x+Q+R+S+N+T+T+S+N+S+S+M+S+S+S+M+N+S+Q+N+S+Q+S+S+N+T+O+g+G.                                                                                        O.l+M+S+Q+S+S+S+S+Q+S+N+R+S+N+T+R+M+S+S+Q+S+N+S+Q+M+N+O+r+Z.                                                                                        s.c+H+S+S+S+S+N+S+Q+Q+Q+S+S+N+Q+N+Q+S+N+N+T+R+S+S+R+M+S+A+,+                        ",
+"                                                                                                                                    2.3+U+T+R+R+T+T+R+T+R+T+T+T+T+R+T+T+T+T+R+T+T+T+R+T+R+R+H+V+q.                                                                                      D ^+y+W+R+R+R+R+R+T+R+T+R+R+R+T+R+T+T+T+T+T+T+R+T+T+T+R+S+o+X+                                                                                        O.Y+Q+R+T+T+R+T+T+T+T+R+R+R+T+R+T+T+R+R+R+R+R+T+R+T+T+R+z+>+                      ",
+"                                                                                                                                      t.c+N+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+L+3+                                                                                        (.<+O+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+`+N+n+B.                                                                                      N ~+y+ @Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+ @.@P.                    ",
+"                                                                                                                                        T.p++@`+`+`+`+`+`+`+`+`+`+`+`+`+Z+ @`+`+ @`+`+`+`+`+`+`+G+)+                                                                                        b+e+@@`+`+`+ @`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+ @`+#@9+                                                                                        e.}+L+`+`+`+`+`+`+`+`+`+`+`+`+$@Z+`+`+`+`+`+`+`+`+`+`+`+@@g+B.                  ",
+"                                                                                                                                          ^+A+$@`+`+`+`+`+`+`+`+`+%@`+%@`+`+`+`+`+`+`+`+%@%@`+%@&@x+w+                                                                                        N.v+@@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@`+`+`+`+`+`+Z+E+)+                                                                                        0.c+#@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@%@`+`+`+`+M+0+w.                ",
+"                                                                                                                                          (.[+N+*@*@*@=@*@*@-@*@*@-@*@;@-@*@*@*@;@*@;@-@;@;@*@=@=@%@r+X+                                                                                        *+J+>@*@;@*@*@*@*@*@=@*@*@*@*@*@-@*@-@;@=@,@*@*@*@*@*@>@J+^+                                                                                        S.Y+&@*@-@,@=@,@*@=@-@=@-@;@,@*@-@;@-@-@*@;@-@*@*@-@-@%@N+3+                ",
+"                                                                                                                                            0.k+W+;@'@,@;@'@,@-@,@;@'@;@,@,@;@'@;@;@,@,@;@;@'@,@,@,@&@g+r.                                                                                      *.[+N+*@;@,@;@;@-@;@,@;@;@-@,@,@,@'@;@;@,@,@'@;@'@-@'@)@!@u+ +                                                                                        >+F+~@-@,@,@,@;@=@,@-@{@,@,@;@,@-@)@,@;@;@;@-@'@,@;@;@;@D+{+              ",
+"                                                                                                                                              K.r+*@)@)@)@)@,@'@)@)@)@)@)@)@'@)@)@)@)@)@)@)@)@)@)@)@]@ @7+                                                                                        q.h+&@)@)@,@{@)@)@)@)@)@)@'@)@,@)@,@)@)@)@)@)@)@,@)@)@,@^@q+A.                                                                                       .<+N+,@/@)@)@)@)@)@)@'@)@)@)@)@)@)@)@'@)@)@'@)@)@)@'@)@-@(@w.            ",
+"                                                                                                                                                ;+C+;@_@)@/@/@)@)@'@/@,@'@/@:@/@'@)@/@/@'@'@/@/@)@/@/@=@S+1+                                                                                        G.r+^@/@:@)@)@)@/@/@'@/@:@)@/@/@)@)@)@/@)@,@)@:@/@:@)@:@%@e+                                                                                        b.a+&@:@/@/@'@)@<@:@)@:@/@/@:@,@)@/@:@)@)@/@:@/@/@/@)@)@~@A+3           ",
+"                                                                                                                                                ..1+S+;@)@_@/@)@_@/@_@)@_@_@_@_@/@_@_@_@_@)@_@:@_@_@/@,@[@H+&+                                                                                        .+C+]@_@_@_@,@_@_@/@<@:@)@_@_@)@:@_@_@)@/@_@_@_@_@_@_@_@Z+[+                                                                                        z.n+}@|@:@)@_@_@:@/@_@_@_@_@/@:@/@_@_@)@_@)@/@_@:@)@_@1@%@8+          ",
+"                                                                                                                                                  6.e+S+:@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@:@/@_@{@A+2@                                                                                        3@N+]@_@_@_@_@_@_@_@:@/@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@]@#@'+                                                                                        W.C+{@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@/@)@_@_@_@_@_@_@4@$@w+        ",
+"                                                                                                                                                    B.v+)@5@_@6@5@_@7@_@_@_@_@_@_@_@6@8@8@6@_@_@7@6@_@6@5@_@,@p+t.                                                                                      1.7+9@4@_@5@_@5@8@6@_@7@7@_@6@7@8@6@_@_@_@_@_@_@_@5@_@5@:@D+W.                                                                                        ]+N+_@8@5@8@6@_@_@_@_@_@_@6@8@5@_@5@_@8@7@6@_@5@0@8@5@:@@@Q.      ",
+"                                                                                                                                                      %+D+<@7@5@5@7@5@5@5@7@5@5@7@5@7@7@6@6@7@5@_@5@5@5@5@5@8@=@c+                                                                                        t.r+,@6@5@5@0@8@5@7@7@5@5@7@5@7@5@5@5@5@5@7@5@5@5@7@5@6@)@u+E.                                                                                      a@f+>@5@5@5@7@5@5@7@5@7@6@6@7@5@_@7@5@7@5@5@5@5@5@7@5@7@b@M+(.    ",
+"                                                                        z                                                                               )+c@6@d@e@7@7@7@f@d@7@d@7@e@7@f@5@f@f@5@f@7@5@7@d@d@f@7@%@5+                                                                                        T.E+8@d@f@5@e@f@7@7@7@d@5@e@e@7@7@d@e@7@5@f@7@7@f@5@d@e@;@q+                                                                                        B.q+{@7@e@7@f@7@7@5@e@f@e@7@7@f@7@f@5@f@7@5@f@7@7@e@f@7@{@a+g@  ",
+"                                                                        G &.                                                                            (.f+>@d@h@h@h@h@e@i@h@7@i@h@h@7@d@h@7@d@h@h@7@h@i@7@h@h@6@ @{+                                                                                        )+&@d@d@d@i@j@d@h@h@7@d@i@i@h@h@e@h@h@0@d@h@h@7@d@h@h@e@~@a+                                                                                        Q.D+|@h@h@j@h@i@d@d@i@i@d@7@h@h@7@d@i@d@7@i@h@h@h@j@h@d@:@k@  ",
+"                                                                        f %+&+                                                                            s.p+:@h@i@h@h@d@h@h@e@h@h@h@e@h@h@e@h@i@i@d@h@h@e@h@h@l@7@D+Q.                                                                                      [.8+*@6@h@h@h@h@h@h@e@h@h@h@h@i@d@h@h@e@e@h@h@d@i@h@h@h@m@$@d+                                                                                        &+@@7@i@h@h@i@h@l@h@i@d@i@h@h@d@h@h@d@i@h@h@h@i@h@h@i@h@,@;+",
+"                                                                         .c+E+!+                                                                            W.D+7@n@i@n@o@p@h@o@o@n@n@n@o@n@n@o@n@n@o@n@n@n@h@o@n@i@:@A+K.                                                                                      r.q@:@p@n@n@n@n@n@n@o@o@o@i@o@n@o@h@p@n@o@n@o@n@n@o@n@n@7@@@&+                                                                                        8+>@e@o@n@h@h@n@o@n@o@n@n@n@o@n@o@o@n@o@o@o@i@o@n@h@h@o@&@",
+"                                                                        2.u+[@D+T.                                                                            {+$@l@o@n@n@n@n@n@n@o@n@o@n@n@o@n@n@n@n@o@n@o@o@n@n@n@o@)@l+                                                                                        S.E+f@n@o@n@o@o@n@n@n@n@o@n@o@n@n@n@o@n@o@o@n@n@o@n@o@n@6@E+S.                                                                                      0.q+4@n@n@n@n@n@o@o@n@o@o@n@o@o@n@o@n@n@n@o@n@n@n@o@n@n@7@",
+"                                                                      P r.E+r@8@r+                                                                              9+-@s@o@n@n@o@n@n@n@o@n@n@o@n@n@o@n@o@n@n@n@n@t@n@o@n@p@;@m+                                                                                        ~+T+i@u@n@o@n@v@n@n@n@n@o@n@o@o@n@n@n@n@n@n@o@o@n@o@n@n@_@Y+                                                                                        H.E+7@n@o@n@n@o@o@v@n@o@n@n@n@o@o@o@n@n@n@n@n@o@n@n@n@p@",
+"                                                                      ! I.M+p@v@)@w@                                                                            a.l+_@n@x@o@n@n@o@n@y@v@n@x@x@n@n@u@v@o@o@n@x@v@n@v@v@n@l@^@d+                                                                                        [+-@n@x@o@n@z@v@v@v@x@x@n@n@o@n@n@n@x@n@v@v@z@n@o@n@z@o@,@a+                                                                                        %+R+d@n@n@o@n@z@z@n@n@x@x@o@n@x@n@x@v@n@x@n@v@n@v@n@n@",
+"                                                                      { Z.&@o@n@p@-@[+                                                                            H.(@7@x@v@x@x@n@x@x@z@v@x@x@x@v@x@x@n@v@v@n@n@x@n@x@x@u@i@@@#+                                                                                      8.k+4@u@n@x@x@n@v@x@v@n@x@v@n@x@v@x@x@x@z@x@y@x@n@v@z@n@o@*@1+                                                                                        (+>@o@x@v@n@x@x@x@x@x@z@n@x@z@n@n@z@x@v@x@z@v@x@v@n@",
+"                                                                      ~ ]+)@A@B@C@x@Z+~+                                                                            Z.@@n@C@C@C@C@D@B@E@B@z@x@D@D@z@D@B@B@D@B@z@C@C@C@C@C@D@l@E+                                                                                        A.z+f@C@C@F@B@B@C@D@x@D@C@C@C@A@C@x@B@z@B@n@B@D@C@F@G@C@v@Z+*+                                                                                      _.g+8@B@C@B@z@v@x@D@v@B@C@C@B@B@B@C@B@x@z@D@D@C@C@D@",
+"                                                                      6 9+7@H@I@A@A@i@S+Z.                                                                            (+)@D@I@A@B@A@A@I@I@I@C@I@A@I@B@C@A@I@A@A@A@A@I@I@B@A@I@d@u+                                                                                        $+S+n@I@A@A@I@A@I@C@A@I@A@I@C@C@I@I@I@I@C@A@A@I@C@B@I@J@o@L+Q.                                                                                      u.y+i@B@B@I@C@A@I@D@C@C@I@A@I@A@A@I@C@I@I@I@I@C@D@",
+"                                                                      D g+l@H@A@I@B@A@l@y+                                                                              e+:@A@I@x@I@I@A@A@A@I@I@A@A@I@A@I@A@A@A@B@G@I@A@x@A@I@C@8@e+                                                                                        (+-@z@A@I@A@I@A@I@A@B@I@A@B@D@I@I@A@I@A@A@A@A@A@I@I@A@K@h@.@                                                                                         +N+i@z@I@I@I@A@I@A@I@I@I@A@A@A@I@I@I@B@A@A@D@B@",
+"                                                                      [.p+i@L@I@I@I@A@D@0@l+                                                                            u.y+d@I@I@I@A@I@I@A@I@A@I@A@A@A@I@I@A@A@I@A@I@A@I@A@I@J@E@*@1+                                                                                        e+/@z@A@A@I@I@I@A@A@A@I@A@A@A@I@I@A@A@I@A@I@I@A@A@I@A@z@8@n+                                                                                        )+*@z@L@A@I@I@I@I@A@I@I@I@I@A@I@A@I@A@A@I@A@A@",
+"                                                                      b.F+x@M@I@H@H@H@L@B@<@m+                                                                            X.R+x@L@H@H@H@L@H@H@H@H@L@L@H@H@L@H@I@H@H@L@L@L@H@H@H@L@B@Z+w+                                                                                      m.y+l@I@N@H@L@A@H@H@L@H@H@H@H@H@H@H@L@H@H@H@L@H@H@H@L@I@C@/@3+                                                                                        e+8@A@H@L@H@H@H@H@H@L@L@H@H@L@J@H@L@H@L@H@L@",
+"                                                                      t.M+B@H@H@H@L@H@H@J@z@>@{+                                                                            {+*@v@H@H@L@H@H@H@I@L@H@I@L@L@H@L@H@H@H@I@H@A@L@H@I@H@L@n@H+                                                                                        O.H+n@H@H@H@H@L@H@L@I@I@H@H@L@H@L@H@I@L@H@I@I@H@H@H@H@H@z@`+^+                                                                                      b.q+d@L@H@H@H@H@I@H@I@I@H@H@H@H@H@J@L@I@L@I@",
+"                                                                    ! X+^@L@N@O@N@M@N@H@N@H@v@ @#+                                                                            7+|@C@M@P@M@L@N@H@M@N@H@N@M@H@M@M@N@H@H@N@M@H@H@M@M@L@M@Q@R@                                                                                        ~+*@C@M@N@M@N@I@L@S@M@M@L@N@M@H@N@M@M@N@N@M@N@H@S@H@N@H@v@@@                                                                                        G.E+n@M@L@H@S@M@T@T@H@T@N@O@N@N@L@L@H@N@H@",
+"                                                                    { *+U@P@V@M@H@H@V@L@N@M@N@v@A+                                                                            0.p+f@M@V@M@H@T@N@M@V@V@M@N@N@T@H@M@N@N@T@M@H@T@M@L@H@T@O@W@j+                                                                                        K+:@A@T@M@M@H@P@V@P@H@M@V@N@L@M@T@M@T@T@T@M@T@V@H@M@M@N@t@F+                                                                                        *+~@K@H@N@T@M@P@V@T@M@M@M@N@H@H@N@T@T@H@",
+"                                                                    4 )+|@X@T@V@T@T@V@T@T@T@T@M@d@p+                                                                            G.L+v@T@T@T@V@V@T@V@M@N@V@T@T@T@T@V@V@T@T@V@T@T@T@T@T@V@Y@Z@B+                                                                                        l+d@M@T@T@T@T@V@T@T@V@V@T@T@V@T@T@V@T@H@V@V@T@V@T@T@T@M@d@l+                                                                                        K+4@L@V@M@M@T@T@L@N@T@T@T@T@T@T@V@T@T@",
+"                                                                    | `@d@V@V@T@T@T@V@T@T@T@T@T@O@|@`@                                                                            .+9@K@V@T@V@T@T@T@T@V@T@T@T@V@V@T@T@T@V@T@T@T@V@T@T@T@T@E@^@%+                                                                                      z.D+o@T@T@V@T@T@T@T@V@V@T@T@V@V@V@V@T@T@V@T@T@T@V@V@T@T@A@]@ #                                                                                        n+e@O@V@V@T@T@T@T@T@T@V@V@T@T@V@T@V@",
+"                                                                    A j+x@.#+#+#+#X@T@V@V@T@V@T@T@Y@:@,+                                                                            3+_@L@@#T@T@.#.#+#@#.#T@.#+#+#T@V@T@T@T@V@+#+#+#T@##.#.#z@S+                                                                                        k@%@K@T@V@T@T@T@V@.#T@@#+#X@V@.#.###+#.#+#+#T@##T@V@T@T@D@%@-+                                                                                      A.I+x@P@##.#+#V@##+#+#+#T@T@T@T@T@T@",
+"                                                                    &.y+B@.#.#.#.#.#.#.#.#####.#.#+#L@Z+                                                                              q+d@X@.#.#+#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#+#+#.#.#+#$###v@A+                                                                                        :+)@M@.#.#.#.#.#.#.#@#+#.#.#+#.#.###.###.#.#.#.#.#.#.#.#G@R+                                                                                        #+Z+L@%#.#####.###.#.#.#####.#.#.#",
+"                                                                    b.H+A@.#.###.#.#.#.#.###.#.#.#.#.#B@U+                                                                            r.F+x@##.#.###.#.#.#.#.#####.#.#.###.#.#.###.#.#.#.#.#.#N@7@g+                                                                                        &#e@T@.###.#.#.#.#.#####.#.#.#.#.###.#.#.#.###.###.#.#+#x@E+                                                                                        )+{@P@.#.#.###.#.#.#.#.#.###.#.#",
+"                                                                    v.c@M@$#.#%#.#.#$#.#X@.#$#@#.#%#$###v@s+                                                                            T.&@A@.#$#%#.#$#$#.#$#.#.#$#$#+###$#$#.#$#$#.#.#$#$#.#$#T@_@3+                                                                                        x+x@%###+#$#$#.#.#%#.###$#$###.#$#.#$#.#.#.#$#+#+#$#$#+#s@r+                                                                                        7+e@##.###$#.#*#%###.#$#.#+#$#",
+"                                                                  1 T.;@+#$#$#$#$#$#$#$#.#$#$#*#$#.#$#$###f@a+                                                                            {+-@M@.#.#$#$#$#$#$#$#$#$#$#.#$#$#$#$#.#$#.#$#$#$#$#$#$#H@;@~+                                                                                      S.@@Y@*#.#$#$#$#$#.#.#%#$#.#%#$#$#$#$#$#$#$#$#.#.#$#$#$#V@6@7+                                                                                        u+n@+#$#$#$#$#$#$#$#$#$#.#$#",
+"                                                                  : *+6@.#$#$#$#$#$#.#.#$#$###%#$#$#$#$#$#T@{@]+                                                                            7+f@X@$#$#$#$#$#$#$#$#.#.#$#$#.#.#$#$#$#$#$#$#$#$#$#$#$#I@&@                                                                                        *+~@M@$#.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%###$#$#.#.#$#$#N@,@~+                                                                                      H.#@A@$#$#$#$#$#$#$#.#.#$#%#",
+"                                                                  j.(+d@$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#Y@&@                                                                              r+o@.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$###v@x+                                                                                        3+8@+#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#L@@@                                                                                        &+*@M@$#$#$#$#$#$#$#$#$#$#",
+"                                                                  6 8+p@$#$#$#=#$#$#=#=#$#$#$#$#$#$#$#$#$#$#$#D@-#                                                                            A.D+G@%#$#$#$#=#=#$#$#=###$#$#;#$#$#=#$#$#$#$#$#$#$#$#=#X@f@>#                                                                                        o+p@%#=#$#$#$#$#$#$#$#=#$#$#$#=#=#$#$#=#$#$#$#=#$#$#;#$#x@C+                                                                                        }+_@X@$#$#=#$#$#$#$#.#$#",
+"                                                                  D p+z@=#=#=#,#,#=#'#)#=#=#=#=#=#=#,#=#=#=#!#%#v@u+                                                                            W.;@+#=#=#=#,#,#=#,#,#=#=#'#'#=#=#,#=#=#=#,#=#=#=#=#'#!#+#|@K+                                                                                      D.H+C@,#=#=#'#=#=#=#=#!#=#=#=#,#)#=#=#)#,#=#=#,#=#=#'#!#.#s@Y+                                                                                        j+x@.#=#,#,#=#=#=#=#=#",
+"                                                                  &.A+T@~#)#{#,#)#{#,#)#]#]#{#)#)#~#]#)#)#~#,#)#;#n@k+                                                                            3+7@=#)#)#=#)#{#]#)#{#~#~#{#)#)#)#)#)#{#)#{#~#~#{#'#~#]#+#{@                                                                                        ++*@##,#)#!#)#)#)#)#,#)#~#)#)#)#)#]#)#,#)#)#{#~#)#,#)#]#^#Q@8+                                                                                        L+I@=#,#]#~#)#{#)#]#",
+"                                                                  k.@@$#/#(#_#]#]#(#]#)#/#/#(#(#]#(#]#)#/#/#{#(#(#:#7@1+                                                                            q+D@~#_#)#(#(#/#/#(#(#/#]#]#/#]#]#]#(#<#]#[#/#(#/#]#_#]#N@>@                                                                                        [+|@.#~#]#]#/#_#_#)#/#/#(#]#)#/#/#(#(#_#_#~#(#]#]#]#~#(#.#8@(+                                                                                      W.}#@#)#/#/#]#(#(#/#",
+"                                                                  G.,@'#/#_#/#_#_#_#_#/#_#_#_#_#_#_#_#/#_#_#_#_#_#_#%#;@                                                                              |#N@~#/#_#/#/#_#_#_#_#/#_#/#_#_#_#/#/#_#/#/#/#_#_#/#_#)#N@O+                                                                                        g+x@!#_#_#/#_#_#_#/#_#/#_#/#_#_#_#/#_#_#_#_#_#_#_#/#_#/#.#;@                                                                                        ]+5@'#/#/#_#_#_#_#",
+"                                                                  W.6@~#1#2#_#_#3#4#/#_#3#1#3#_#_#2#_#_#3#3#/#/#_#2#(#5#R+                                                                             +;@##(#1#3#_#_#2#_#2#_#_#3#1#_#_#_#/#/#_#2#/#_#1#3#_#/#/#D@.@                                                                                        J+O@/#_#/#_#_#_#_#3#3#_#_#2#/#_#3#1#2#/#_#1#3#/#_#_#_#_#N@ @                                                                                        c+n@]#4#_#_#3#1#",
+"                                                                { )+x@6#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#6#1#O@C+                                                                            (+0@{#2#6#2#2#2#2#2#2#2#7#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#/#t@7+                                                                                      T.!@;#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#1#M@F+                                                                                        D+T@1#2#2#2#2#",
+"                                                                <.[+G@8#9#9#9#8#9#0#9#9#8#8#9#9#8#9#0#9#9#9#9#8#9#9#9#a#b#A@p+                                                                            n+A@/#c#0#8#8#8#9#9#9#8#9#9#8#9#9#d#9#9#9#9#8#9#9#0#9#9#(#r@                                                                                        (+l@/#8#9#9#8#8#9#9#9#e#9#9#9#8#8#9#9#9#9#9#9#8#9#9#9#f#3#K@n+                                                                                      P.*@'#8#8#9#9#",
+"                                                                  %+l@_#g#h#i#i#h#j#c#j#i#9#j#h#0#k#j#i#h#i#j#0#h#h#i#i#j#1#E@7+                                                                            L+.#9#j#0#c#8#h#j#i#c#j#j#9#k#i#9#h#k#j#j#j#h#h#j#h#9#c#~#_@                                                                                        j+Y@2#h#h#9#0#k#j#h#j#h#j#h#h#9#h#j#h#l#k#j#9#h#j#9#i#k#1#t@                                                                                        ]+e@1#9#i#9#",
+"                                                                    y+T@m#k#j#j#k#j#k#g#g#h#k#k#k#k#g#j#k#h#g#k#k#k#j#j#k#h#1#e@                                                                              -@)#j#k#k#j#k#j#k#k#k#g#k#k#i#k#k#h#i#i#g#k#h#g#k#j#k#i#,#`+                                                                                        E+@#l#k#h#k#k#g#k#j#h#g#k#k#h#k#g#k#k#h#i#h#k#g#h#j#n#j#]#8@                                                                                        o#Y@2#k#h#",
+"                                                                      %@!#k#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#q#(#)@                                                                            /+l@2#p#p#p#p#p#p#q#n#p#p#p#p#p#p#r#p#p#p#p#p#p#p#p#p#p#c#%#D+                                                                                        -@!#k#p#p#p#p#p#p#r#p#p#r#p#p#p#p#q#q#p#p#p#p#p#p#n#p#q#]#;@                                                                                        h+%#c#p#",
+"                                                                      %+8@_#n#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#,#R+                                                                            e+I@a#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#p#p#p#r#a#N@l+                                                                                      {+d@3#q#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#n#q#p#p#p#h#;#S+                                                                                        W+!#s#",
+"                                                                        a+K@0#t#t#t#u#t#u#t#v#u#t#u#w#v#v#w#t#t#t#t#t#t#t#t#u#w#r#*#C+                                                                            M+=#x#t#t#w#v#v#w#u#t#u#t#t#t#t#t#t#t#t#v#w#u#t#w#u#w#w#a#A@                                                                                        c+K@i#t#t#t#u#t#t#w#v#v#w#t#t#u#w#v#v#w#u#t#t#t#t#t#t#t#s#.#x+                                                                                      T.y#e#",
+"                                                                          F+;#z#A#B#B#B#B#v#C#B#B#u#B#B#u#u#B#B#B#B#B#B#B#B#B#B#B#q#X@                                                                              ,@2#w#D#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#B#B#B#B#v#B#B#u#u#9#l@                                                                                        E+$#E#B#B#B#B#B#B#B#B#B#v#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#n#H@                                                                                        Q.##",
+"                                                                            *@7#F#G#G#H#G#G#H#I#G#A#J#K#H#J#G#I#G#G#I#I#H#K#G#I#K#I#k#E@                                                                            {+o@j#H#I#K#F#J#G#G#F#K#I#H#K#J#G#H#G#G#I#J#K#I#I#G#F#G#L#e#:@                                                                                        U@M#L#G#J#H#J#G#H#I#G#G#H#K#J#F#G#G#A#G#H#I#J#K#G#I#G#H#h#y@                                                                                        N#",
+"                                                                              l@h#O#P#Q#R#S#S#R#R#S#S#R#S#S#S#K#S#R#Q#G#S#R#R#O#R#R#G#j#l@                                                                            e+T@E#G#P#R#R#R#O#S#R#Q#O#S#S#Q#S#S#R#O#S#S#S#T#R#S#R#U#A#1#Z+                                                                                        l@q#O#S#Q#S#S#S#T#R#S#Q#R#O#S#R#O#S#S#Q#O#S#R#Q#O#S#R#J#i#5@                                                                                        ",
+"                                                                              8+J@z#V#W#W#U#X#Y#W#W#X#U#W#Z#W#R#Z#X#Y#`#W#W#X#W#W#W#Y#G#6#,@                                                                            E+{#L#R#X#X#U#S#Z#X#W#X#X#W#W#U#W#X#Y#W#W#Y#`#W#W#X#W#S#J#)#A+                                                                                      7+T@t#Y#W#W#W#W#W#W#U#Z#W#R#Z#Y#S#Z#X#W#W#Z#Y#Y#W#W#X#Y#I#6#*@                                                                                      ",
+"                                                                                x+=#L#Y#Z#X#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $I#/#c@                                                                            >@e#O# $Z#X#Z#Z#Z#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $.$@#                                                                                        F+)#H# $Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#+$I#@$-#                                                                                    ",
+"                                                                                  %@6#R##$$$%$%$&$%$%$&$#$$$#$%$&$%$%$%$%$%$%$%$#$$$%$%$#$G#{#                                                                              p@v#*$&$&$&$&$%$%$&$%$%$%$%$%$%$%$%$&$%$%$$$#$%$&$&$#$*$w#=$                                                                                        -@9#Y#*$%$%$%$$$#$%$&$$$#$&$&$&$%$%$#$$$%$%$%$%$%$%$%$#$G#$#                                                                                    ",
+"                                                                                    d@x#*$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$$J#@#                                                                            a+@#G##$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$-$;$i@                                                                                        o@x#*$>$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$#$A#M@                                                                                  ",
+"                                                                                      T@F#,$,$'$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$>$,$,$&$L#D@                                                                            E+/#X#>$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$,$>$,$,$,$,$,$,$,$*$h#{@                                                                                      8+@#O#,$)$,$'$,$,$>$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$'$!$$$v#B@                                                                                ",
+"                                                                                      s+]#~${$]$^$]$^$^$]$^$^$^$)$]$)$)$)$]$)$)$]$)$)$]$^$]$/$>$w#f@                                                                            ;@($>$]$]$^$]$)$^$]$)$)$]$)$)$]$^$/$/$]$]$]$]$]$^$]$]$)$~$9#S+                                                                                      z+_#X#_$^$]$]$]$]$]$^$]$]$]$]$^$)$)$]$)$)$^$/$)$]$]$]$)$>$w#:$                                                                              ",
+"                                                                                        ^@g#>$<$[$<$[$<$[$[$}$[$^$[$<$<$]$<$<$^$|$<$]$1$[$}$}$}$'$p#;@                                                                            v@F#)$<$[$[$}$[$}$}$}$<$<$]$|$1$}$<$|$<$|$}$|$<$[$|$]$]$*$]#                                                                                        >@j#&$]$[$<$<$[$|$<$}$[$<$|$<$2$}$<$<$<$<$<$}$<$[$<$]$|$,$q#%@                                                                            ",
+"                                                                                          l@B#]$|$3$|$4$3$5$3$3$5$5$|$4$3$|$3$5$3$3$3$3$3$|$|$|$3$!$e#                                                                              ##Y#<$3$5$6$5$|$3$3$|$4$3$3$3$6$|$3$6$|$|$3$|$3$3$3$5$<$7$^#                                                                                        l@J#8$5$6$|$5$3$|$[$3$3$3$|$5$9$6$4$3$|$5$3$|$5$|$3$0$|$$$2#                                                                            ",
+"                                                                                            N@X#5$a$a$a$a$a$b$b$a$a$a$b$a$3$b$a$a$a$a$a$a$a$a$a$a$0$>$/#                                                                            y+2#>$c$a$a$a$a$a$a$9$a$a$a$a$a$a$b$a$a$a$b$b$a$d$a$a$d$5$Y#H@                                                                                        .#X#3$d$a$b$a$a$a$a$a$a$a$a$b$b$a$a$b$3$b$a$a$b$b$a$a$9$&$@$                                                                          ",
+"                                                                                            v+4#>$a$a$d$a$a$a$d$a$a$a$e$b$a$a$b$a$f$b$a$a$d$a$e$d$a$5$~$%#                                                                            g$p#]$a$e$b$a$a$d$a$e$a$a$9$a$a$e$d$a$a$a$a$a$a$e$a$a$e$h$F#7@                                                                                      .@4#>$9$b$e$a$d$a$a$a$a$a$a$a$a$a$a$a$a$a$a$9$a$b$e$d$a$c$ $T@                                                                        ",
+"                                                                                              Z+x#}$d$i$j$j$k$l$l$j$l$i$j$k$l$j$l$l$j$l$l$m$j$i$j$m$n$a$S#A@                                                                            p@T#e$i$l$m$l$o$j$i$j$l$l$o$k$i$j$m$l$l$j$j$l$i$l$m$i$l$5$w#                                                                                        !@u#|$d$i$l$m$m$l$j$k$j$i$i$k$l$l$j$l$j$k$l$l$m$i$o$n$o$b$O#x@                                                                      ",
+"                                                                                                d@S#d$p$p$q$p$i$p$p$r$r$p$s$p$p$p$p$p$p$p$q$q$p$p$q$p$l$b$O#7@                                                                            $#t$j$q$p$p$p$s$p$s$p$p$p$p$i$q$s$u$p$r$r$p$p$q$p$p$p$p$|$j#                                                                                        i@W#d$v$p$s$s$p$p$s$p$i$r$p$p$p$s$p$r$p$p$p$p$p$p$s$s$l$e$w$/@                                                                    ",
+"                                                                                                  +#%$j$x$y$p$p$x$s$p$s$z$s$z$s$r$s$s$x$p$u$q$s$x$z$s$p$s$b$z#                                                                              1#}$s$p$q$s$s$s$s$x$p$x$r$p$s$x$x$q$y$s$p$x$z$q$q$s$A$p${$B$                                                                                        @#$$k$r$z$s$p$x$s$q$p$u$s$q$q$x$q$x$s$p$x$p$r$p$z$s$q$u$4$q#                                                                    ",
+"                                                                                                    (#}$z$C$C$C$D$C$C$C$D$E$F$C$C$C$C$F$C$F$C$C$F$F$C$C$F$C$0$c#                                                                            ^@u#m$z$C$C$C$C$E$D$C$F$C$C$C$E$E$C$G$E$C$G$D$E$C$C$C$C$s$_$$#                                                                                        2#[$z$C$E$E$D$E$E$C$H$C$E$C$C$C$C$G$C$C$C$C$C$C$E$C$C$x$4$i#                                                                  ",
+"                                                                                                    S+t#j$F$I$I$I$I$J$I$J$I$I$I$J$I$J$J$J$I$J$I$I$J$I$I$J$I$F$c$/#                                                                            o@Z#q$K$L$I$J$J$J$J$J$I$J$I$J$I$J$I$J$J$J$J$J$I$J$I$I$K$x$$$Y@                                                                                       @w#k$L$J$J$J$I$I$I$J$I$I$F$I$I$I$I$J$J$J$I$I$I$J$I$I$I$F$5$B$                                                                ",
+"                                                                                                      6@W#x$J$J$M$M$N$I$O$O$O$O$O$O$O$M$O$O$O$M$M$O$O$J$O$O$O$H$P$.#                                                                            $#)$Q$O$O$M$M$O$O$O$O$M$O$O$M$M$O$O$J$O$M$O$I$O$O$O$O$I$x$W#                                                                                        i@X#A$O$J$O$M$O$I$O$M$O$O$M$O$O$O$O$O$O$O$O$O$O$O$O$M$O$E${$T@                                                              ",
+"                                                                                                        +#)$D$O$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$O$R$R$R$M$z$$$z@                                                                            e#0$J$R$R$R$R$O$R$R$R$R$R$R$R$R$R$M$S$R$R$R$R$R$R$R$R$S$q$F#                                                                                        .#}$K$R$R$R$R$M$R$R$R$R$R$R$R$R$O$R$R$R$R$R$R$R$R$R$R$M$z$~$                                                              ",
+"                                                                                                          T$U$R$V$W$V$V$W$X$V$W$V$W$V$W$V$R$V$V$Y$W$V$Z$W$V$V$Z$W$Q$P#                                                                             @L#u$Y$V$W$V$W$Y$V$W$X$V$V$V$W$V$Y$W$V$W$V$V$W$V$V$V$W$M$i$n#                                                                                        8#j$X$Y$V$V$Y$V$Y$V$V$V$Y$W$W$V$R$W$V$Y$X$V$V$W$W$V$W$Y$A$K#                                                            ",
+"                                                                                                            w#`$Y$ % %Z$Z$Z$ %V$ %.% % % %Z$ % %V$+% %V$+% % %V$ %V$x$u#                                                                            d@@%#% %Z$ %V$ % %V$Z$V$ %$%V$ %V$Z$.%V$ % %.% % % % %%%Y$d$&%                                                                                        u#`$X$ % %V$V$ % % % %.%V$ % % %V$ %Z$Z$ % %Z$V$ %V$$%W$q$*%                                                          ",
+"                                                                                                            |@U#K$=%-%=%$%;%>%-%>%>%>%>%>%>%-%;%;%-%>%.%;%-%$%=%-%>% %v$k#                                                                            V@3$+%,%;%;%-%>%;%>% %>%,%;%;%$%$%-%;%$%-%;%>%$%;%>%-%>%+%5$+#                                                                                      f@%$J$=%=%=%$%;%$%$%$%>%;%>%>%;%;%;%>%-%;%-%>%-%-%$%;%'%Z$k$a#                                                        ",
+"                                                                                                              I@5$W$>%)%!%!%~%!%{%!%]%{%!%!%^%{%^%^%!%!%~%^%!%^%^%!%^%Z$m$/#                                                                            /%q$ %(%!%{%^%!%!%^%!%(%]%^%!%^%^%!%^%!%!%^%!%!%!%{%!%;%R$)$                                                                                        +#9$Z$>%_%]%^%^%(%(%^%^%!%!%(%~%!%!%^%{%!%:%^%!%!%^%{%^% %d$<%                                                      ",
+"                                                                                                                _#k$-%:%:%:%[%:%[%~%[%[%[%:%[%:%[%~%:%~%~%:%:%~%:%:%[%~%}%a$                                                                              J#K${%[%:%[%[%:%[%~%[%~%~%:%~%:%~%[%:%[%[%[%:%[%~%[%:%!%R$~$                                                                                        |%k$-%~%~%[%[%[%1%[%[%:%[%~%[%:%1%[%~%[%:%~%~%:%~%:%[%^% %5$                                                      ",
+"                                                                                                                  x#F$^%[%[%[%[%[%2%[%[%2%[%[%2%1%[%2%[%2%[%1%[%[%[%[%[%[%Z$,$                                                                            5@$$W$:%1%[%2%[%[%2%2%[%[%1%2%[%[%[%[%[%[%[%[%2%[%[%2%[%!%I$F#                                                                                        u#F${%1%[%[%[%[%[%[%[%2%[%[%[%2%[%2%2%1%[%[%2%3%[%[%[%~%Y$>$                                                    ",
+"                                                                                                                    *$4%5%6%6%6%6%6%2%6%6%6%6%6%2%6%6%2%6%6%2%6%6%6%6%6%6%7%R$U#                                                                            V@8%9%5%2%6%6%6%6%2%6%6%2%6%6%6%6%6%6%6%6%6%6%6%2%6%6%5%0%u$k#                                                                                        a%V$5%6%6%6%6%6%6%6%6%6%2%6%6%6%6%2%6%6%6%2%6%6%6%6%6%7%b%T#                                                  ",
+"                                                                                                                    A@c%d%5%e%f%6%g%h%6%g%g%i%f%i%g%6%6%f%i%6%g%f%6%g%g%6%j%k%l%m%                                                                            _#n%o%6%p%g%e%6%g%g%f%6%i%g%6%e%f%6%j%f%6%g%g%g%6%i%q%6%r%s%)#                                                                                      O@t%u%6%i%g%f%6%v%g%f%i%q%6%f%h%f%f%g%g%6%6%i%6%e%g%6%6%w%x%y%                                                ",
+"                                                                                                                      z%A%B%v%C%C%e%D%C%C%e%v%E%F%e%e%G%e%e%e%v%F%e%v%C%F%q%i%H%I%J%                                                                            K%L%M%g%v%F%F%C%g%f%v%e%v%v%C%v%g%v%v%F%C%i%C%C%f%F%q%N%O%c%                                                                                        P%s%o%i%C%F%e%F%C%v%e%F%C%F%v%Q%F%f%e%e%e%R%g%C%C%e%e%v%S%T%U%                                              ",
+"                                                                                                                        V%W%X%Y%Z%`%`%Z%`%Z%`% &Z%`%Z%`%`%Z%`%Z%`%Z%`%`%`%`%C%Y%.&+&                                                                              @&#&$&%&Z%Z%`%Z%`%Z%Z%%&`%C%Y%Z%Y%`%`%Y%&&*&`%Y%`%Z%Z%v%=&-&                                                                                        K%;&>&Y%,&Z%Z%Z%C%`%C%Z%`%`%Z%Z%Y%`%Z%Z%Y%Y%Y%`%Z%Z%Z%Y%B%'&                                              ",
+"                                                                                                                          )&!&~&{&]&{&^&]&]&^&^&]&^&^&]&/&]&^&]&/&]&^&^&^&/&]&^&(&_&:&                                                                            <&[&}&|&^&^&^&]&^&/&/&]&^&]&^&]&^&^&^&/&]&^&/&]&^&^&^&]&1&2&3&                                                                                        4&5&6&(&/&^&^&]&]&]&^&^&/&^&^&]&^&^&]&]&^&/&^&]&]&^&^&(&_&7&                                            ",
+"                                                                                                                          8&9&_&0&]&/&]&]&]&a&a&/&a&a&]&]&]&a&a&]&]&a&a&]&]&/&]&]&(&b&c&                                                                            d&e&f&]&a&]&]&a&/&/&]&]&a&a&/&a&a&/&/&]&]&]&]&a&a&]&/&a&g&h&i&                                                                                      j&k&l&m&]&a&]&]&]&]&]&]&a&a&]&]&a&a&]&]&]&a&a&]&]&a&]&]&n&o&p&                                          ",
+"                                                                                                                            q&r&f&]&a&a&a&s&a&a&t&a&a&a&a&a&a&a&a&a&]&a&a&a&a&a&a&a&(&u&v&                                                                            i&w&n&]&a&a&a&a&]&a&a&a&a&a&]&a&a&a&a&a&a&t&a&a&a&t&a&x&y&z&                                                                                        A&B&f&]&/&a&a&a&a&a&a&t&a&C&a&a&a&a&/&a&a&C&a&a&D&a&a&]&n&E&F&                                        ",
+"                                                                                                                              G&H&I&t&J&K&t&t&K&K&t&t&J&L&M&K&J&s&L&J&t&M&L&L&t&t&t&N&O&P&Q&                                                                            R&S&O&J&K&K&K&K&J&L&M&t&s&K&N&L&L&t&T&K&t&t&t&K&N&K&K&U&V&W&                                                                                        X&Y&Z&N&K&J&M&t&L&L&t&t&K&t&J&N&K&K&K&L&K&t&N&K&L&J&t&t&Z&`& *                                      ",
+"                                                                                                                                .*+*@*#*K&#*K&#*J&$*%*J&#*$*#*J&#*$*#*%*$*$*$*J&K&#*J&$*&***                                                                              =*-*J&#*#*#*#*#*$*;*%*J&#*#*#*$*>*J&#*$*J&$*J&#*#*J&J&,*'*)*                                                                                        !*~*{*J&#*#*%*J&J&#*$*K&J&#*J&J&#*#*$*L&#*J&J&J&J&#*$*]*^*/*                                      ",
+"                                                                                                                                  (*_*:*$*<*[*[*}*[*$*$*}*<*$*$*<*$*}*$*$*$*[*}*#*<*#*[*:*|*1*                                                                            2*/*3*:*[*$*#*<*$*$*[*:*[*[*}*#*<*[*$*}*:*[*$*<*[*:*}*4*%*5*6*                                                                                        7*8*:*$*<*$*}*$*<*[*[*}*[*#*:*<*$*$*[*<*$*[*}*#*}*$*9*%*|*0*                                    ",
+"                                                                                                                                  a*b*c*:*d*<*e*f*<*<*<*f*d*e*<*f*e*g*<*<*<*d*f*<*f*<*<*f*:*h*i*                                                                            j*k*l*e*<*<*d*<*<*d*g*<*<*d*<*f*d*<*<*g*<*<*d*<*g*f*d*<*:*+*m*                                                                                      n*o*c*p*d*<*d*<*<*<*<*f*<*<*g*f*<*<*g*f*e*<*f*<*g*<*<*<*q*_*r*                                  ",
+"                                                                                                                                    s*t*u*f*v*v*w*x*x*x*w*x*v*w*w*v*x*f*y*y*x*v*w*y*v*v*y*w*z*A*B*                                                                            C*D*E*x*w*x*v*x*f*x*x*y*x*w*w*x*y*y*v*F*w*w*x*v*w*x*v*w*G*t*                                                                                        H*I*J*f*x*x*w*w*x*w*w*F*v*v*w*x*v*d*w*v*w*K*w*w*x*x*w*L*M*D*N*                                ",
+"                                                      ).                                                                              O*P*z*v*Q*R*v*F*w*x*S*v*x*Q*S*S*v*T*Q*v*x*v*Q*x*T*U*V*W*X*Y*Z*                                                                            `* =g*x*U*x*x*.=Q*S*v*Q*x*S*F*F*S*v*S*v*Q*x*y*x*U*v*F*W*G*+=                                                                                        @=#=$=F*Q*v*S*U*x*Q*S*v*w*Q*.=x*x*U*S*v*Q*v*S*x*v*v*U*%=&=*===                              ",
+"                                                      [.-=                                                                              ;=>=,=S*'=S*Q*S*'=)=U*S*)=S*)=U*'=)=S*'=U*!=S*)='=S*S*v*~={=                                                                              ]=^=/='=Q*S*U*S*'=S*'=S*)=Q*Q*)=U*)=S*'=Q*S*'=!=S*Q*)=v*(=_=                                                                                        :=<=[='=}=)='=S*!=S*Q*Q*)=Q*S*S*!=S*!=!=Q*!=U*!=S*Q*'=|=1=2=                              ",
+"                                                      '+3=                                                                                4=5=}=!=6=7=6=6=6=7=7=6='=7=!=6='=8=7='='=7=7=9='=6=6=0=a=b=                                                                            c=d=e=6=f=7=!=!=6=!=7='=g=6=h=!='=!=6='=6=6=h=7=7=7=6=!=i=j=k=                                                                                        l=m=!=6='=6=7='=7=h=!=7=7=7='=6=!=n=6=o=n=6=6='=!=6=p=.=q=r=                            ",
+"                                                      C+s=l=                                                                              t=u=v=w=x=y=6=7=x=z=7=x=x=A=p=z=B=w=A=x=z=C=D=x=x=A=x=7=E=F=G=                                                                            H=I=J=w=x=6=x=A=7=A=z=K=w=w=x=p=A=x=7=x=x=6=x=w=L=7=x=M=N=O=P=                                                                                      Q=R=S=z=T=B=x=6=C=x=6=x=z=x=6=w=w=T=x=z=K=x=A=z=x=x=A=w=/=U=V=                          ",
+"                                                      ]@W=X=Y=                                                                              Z=`= -M=.-A=A=+-A=A=+-@-.-M=+-#-$-.-.-+-$-$-@-+-.-A=+-M=%-&-*-                                                                            =---E=A=A=.-.-A=.-.-+-$-.-.-M=.-+-;-+-y=A=+-+-A=M=.-.-w=>-,-                                                                                        '-)-!-M=+-+-+-~-y=M=+-+-A=A=+-@-+-+-.-+-+-@-.-+-+-{-.-]-^-&-/-                        ",
+"                                                      s@(-_-:-<-                                                                              [-}-|-.-.-1-1-.-1-1-.-1-.-.-.-.-.-@-.-1-.-.-1-.-.-1-1-.-2-3-                                                                              4-5-6-.-7-1-.-@-.-.-.-.-.-7-.-1-.-1-.-1-1-.-.-8-9-1-.-+-0-a-                                                                                        b-c-d-.-1-1-1-.-@-1-.-1-.-7-.-7-.-@-.-.-.-.-1-.-7-.-1-@-2-e-                        ",
+"                                                    f-g-h-6-i-j-k-                                                                              l-m-n-1-1-8-o-8-8-p-p-p-p-p-p-p-p-q-p-p-8-1-1-p-1-8-o-@-r-s-                                                                            t-u-v-$-8-p-p-p-p-p-p-p-1-p-q-o-.-1-1-1-1-p-1-1-o-p-p-w-q-x-y-                                                                                        z-A-9-o-1-1-1-1-1-p-p-q-1-p-p-p-p-p-p-p-o-o-8-p-.-1-1-@-r-B-                      ",
+"                                                    6.C-D-E-F-G-H-                                                                                I-J-K-F-F-F-F-F-F-F-F-F-L-F-F-M-F-F-M-F-F-M-F-F-F-F-F-N-O-P-                                                                            Q-R-S-w-F-F-F-M-F-F-M-F-F-M-M-F-M-F-F-F-F-F-F-F-F-F-F-M-N-T-U-                                                                                        V-W-w-F-F-F-F-F-F-F-F-F-F-F-F-M-F-F-F-M-F-M-M-F-F-M-F-K-X-Y-                    ",
+"                                                    Y.Z-`- ; ;.;+;@;                                                                              #;$;%;&;*;M-=; ; ; ;=;=; ;-;=; ;=; ;M- ; ; ;M- ; ;M- ; ;E-;;>;                                                                            ,;';); ; ; ; ; ;M- ; ;=; ;M- ; ;M- ;!; ;L- ; ; ; ;=; ;~;{;];C-                                                                                      ^;/;(;&;_; ;M-!;=;-; ; ; ; ; ; ; ;M-M- ; ; ;M- ; ; ;M-!;:;<;[;                  ",
+"                                                    B+};|;1;1;2;_;3;4;                                                                              5;6;7;!; ;1;!;!;!;!;=;!;8;=;!;1;!; ;!;1;!;!;1;!; ;!;1;_;9;0;a;                                                                            };b;c;1; ;!;d;1; ;1;1;!;!;!;1;!;1;8; ;!;1;!;1;!; ;!;8; ;e;f;                                                                                        g;h;i;j;k;1;8;1;1;!;!;1;d; ;!;1;l;M-!;!;1;1;1;1;!;!;l;_;i;m;n;                ",
+"                                                    q@o;p;8;q;r;s;t;u;v;                                                                              w;x;y;z;A;z;s;8;r;r;8;8;s;r;l;s;r;l;r;s;B;l;8;r;8;A;r;C;D;E;                                                                              F;G;_;s;B;8;l;s;l;r;s;s;8;H;B;A;8;r;s;l;s;l;s;s;B;8;I;J;K;L;                                                                                        M;N;O;P;P;8;s;l;z;r;s;8;s;B;8;l;s;8;s;r;r;8;A;s;s;l;s;l;Q;R;                ",
+"                                                    N+S;T;U;V;W;W;W;X;Y;Z;                                                                              `; >.>+>@>W;W;+>+>W;r;U;+>W;W;#>+>V;W;W;+>W;W;W;+>W;W;W;$>%>                                                                            &>*>=>->W;W;q;U;W;W;#>#>W;W;W;@>W;W;+>@>W;W;W;U;W;W;q;W;J;;>>>                                                                                        ,>'>)>!>W;W;+>U;+>W;U;W;W;W;s;W;W;W;V;V;W;+>W;W;+>W;W;->~>*>              ",
+"                                                    |@{>]>^>/>/>(>^>_>:><>                                                                                [>}>|>1>/>_>/>(>^>2>#>^>1>/>/>2>(>/>/>^>/>/>3>^>/>/>/>4>5>6>                                                                            7>8>9>/>1>_>V;1>/>_>/>1>_>/>^>^>_>^>^>(>(>/>/>^>^>_>(>^>0>a>b>                                                                                      c>d>e>|>^>/>^>/>/>2>/>_>3>^>1>#>^>f>/>(>^>/>/>(>^>/>1>^>4>g>h>            ",
+"                                                    i>j>k>1>1>^>^>1>^>l>m>n>                                                                              o>p>q>r>^>^>^>^>1>1>1>1>^>1>^>^>1>1>^>1>^>^>1>1>^>1>^>3>s>t>u>                                                                            v>w>x>1>^>1>^>1>1>^>^>^>1>^>1>^>^>1>^>^>1>^>1>^>^>^>^>(>y>z>A>                                                                                      B>C>:>r>^>1>^>^>(>^>2>^>^>2>1>^>1>^>^>1>^>1>^>1>^>^>1>^>D>E>*$          ",
+"                                                    F>G>H>I>J>J>I>J>K>J>/>L>M>                                                                              N>O>P>^>3>^>K>^>I>I>1>I>K>I>J>J>I>K>^>I>J>^>K>K>^>3>I>3>Q>G>R>                                                                            S>T>U>J>^>J>J>J>J>I>J>I>1>K>J>1>V>J>2>1>K>I>^>J>^>J>K>^>W>X>                                                                                        R>Y>D>J>^>^>I>^>(>I>^>^>K>I>^>I>J>K>J>K>I>^>Z>J>^>^>J>3>`> ,.,        ",
+"                                                  O.+,@,#,$,%,%,&,*,=,-,;,>,,,',                                                                              ),!,>,%,%,*,*,*,$,~,*,%,$,$,%,;,*,*,&,%,%,$,*,*,%,%,-,J>{,],                                                                              ^,/,(,-,*,;,%,;,*,%,~,-,$,=,;,%,%,;,%,-,*,$,*,~,~,%,*,J>_,:,                                                                                        <,,,[,-,%,~,*,%,*,~,*,%,~,%,*,%,%,*,%,%,},-,I>*,%,$,~,|,{,1,        ",
+"                                                  2,3,4,5,6,5,7,5,8,5,5,6,9,0,a,b,                                                                              c,d,#,5,e,8,e,6,7,e,5,e,e,5,5,8,e,8,9,5,6,e,8,5,e,8,e,f,g,h,                                                                            i,j,k,l,8,7,7,7,e,5,7,m,e,5,e,5,e,7,7,e,e,6,8,9,6,7,8,5,n,4,o,                                                                                        p,q,r,5,e,e,7,8,5,e,8,s,l,e,5,5,e,7,5,5,8,5,8,7,6,6,7,f,t,u,      ",
+"                                                  v,w,x,y,z,y,z,z,A,z,9,z,z,B,C,D,                                                                              E,F,G,H,I,z,J,z,7,z,y,K,L,z,z,A,z,z,B,L,z,y,z,A,L,z,y,I,f,M,N,                                                                            O,P,Q,y,y,z,z,z,z,y,L,z,z,J,z,J,z,z,z,y,z,z,9,y,y,A,y,L,R,S,T,                                                                                      U,V,G,B,A,y,z,z,9,z,y,L,y,y,z,z,z,z,L,y,z,z,J,z,z,y,z,I,W,X,Y,    ",
+"                                                  -#Z,`,A, 'z, ' ' ' '.' ' '+'z,@'#'                                                                              $'%'&'*' 'z, 'z, 'A,='+' ' ' ' ' 'z, ' 'A, ' '+' 'A, 'z,-';'>'                                                                            ,''')'z, ' ' ' ' ' ' ' 'z, 'z, ' ' 'A, ' 'z,A,A, 'A, '.'!'~'                                                                                        {']'^'A,A, ' '*' 'A, 'A,A, ' ' ' ' ' ' ' 'z, ' 'A, ' 'z,/'('_'  ",
+"                                                  [@:'<'['}'|'|'}'}'|'1'}'}'|'2'3'4'5'                                                                              6'7'8'|'|'}'|'}'|'}'}'}'}'}'}'|'1'}'|'|'}'9'}'}'|'|'|'|'8'0'a'                                                                            b'c'd'}'}'|'}'|'}'|'}'1'|'}'|'9'}'|'|'|'|'}'}'|'}'}'}'e'f'g'                                                                                        h'i'j'|'}'}'}'}'}'|'|'|'}'}'}'|'|'}'|'}'1'}'|'}'9'}'|'2'k'l'  ",
+"                                                  m'n'8'1'1'1'1'}'1'}'|'1'1'1'1'1'o'p'q'                                                                              r's't'|'1'|'1'1'1'1'1'1'}'1'1'|'1'1'1'1'1'1'u'v'w'}'1'x'y'z'                                                                              A'B'9'1'1'w'}'1'w'}'}'u'u'1'1'u'1'1'C'}'1'1'1'1'1'1'}'D'E'F'                                                                                        G'H'I'w'1'}'1'|'1'}'w'1'1'1'1'1'['u'}'|'1'1'1'1'1'1'1'e'J'K'",
+"                                                  L'M'N'O'P'1'P'Q'O'P'1'R'O'u'Q'S'T'U'V'W'                                                                              X'Y'Z'Q'P'Q'`'O'Q'R'O'P'Q'Q'u'P'Q'u'P'Q'P'1'P'P'P'Q'Q'x' ).)                                                                            +)@)k'P'Q'O'`'P'Q'Q'P'O'`'P'Q'Q'1'P'#)u'Q'1'Q'P'Q'R'P'$)%)H'&)                                                                                        *)B'x'$)u'P'Q'O'P'=)u'Q'P'P'P'`'-)Q'u'O'Q'u'P'Q'w'P'P';)>)",
+"                                                  ,)')))!)~)~){)])^)/)(){)_)_)])/)~){):)<)                                                                              [)})|){)1)~)/)1)2)~)_){)/)/)1){)3)/)/)~){)4){)3)1)~){)1)5)6)7)                                                                            8)9)N'{)_)1){)/)0){)1)~)/)a)/)$){)1)/)~){)!){)$)1)/)/)1)b)c)d)                                                                                      e)f):){)]){)3)1){){)1)g)~)1)3)1)1)0)1)1)/)]){){)a)1)/)!)h)",
+"                                                  i)j)k)l)m)0)n)_)o)p)q)1)r)p)g)m)m)n){)s)t)                                                                              u)v)w)^)q)p)r)^)x)r)q)!)p)m)1)m)l)p)1)m)q)n)l)q)q)p)p)_)5)y)z)                                                                            A)y)B)p)m)1)p)l)1)/)^)p)/)^)q)p)r)m)^)p)p)m)^)r)m)m)p)n)C)D)                                                                                        E)F)G)m)l)l)H)1)l)p)p)q)p)m)1)H)l)/){)!)o)^)^)q)p)p)p)/)",
+"                                                I)J)K)n)L)M)p)M)p)M)N)!)O)N)N)p)M)M)N)M)P)Q)R)                                                                              S)T)U)M)M)M)N)V)N)p)M)M)o)O)M)M)N)O)M)M)N)M)N)M)N)N)M)p)W)X)Y)                                                                            Z)`)P)p)p)N)M)p)V)M)M)p)N)N)N)M)M)M)M)M)M)M) !O)N)N)M)^).!+!                                                                                        @!#!$!p)M)M)M)M)M)M)M)M)O)m)N)M)p)p)M)M)p)N)M)N)N)M)M)",
+"                                                %!&!*!=!-!;!;!=!=!=!=!=!=!=!=!=!=!M)=!=!=!k)>!,!                                                                              '!)!!!=!=!=!=!=!;!=!=!=!=!=!=!=!=!L)M)=!=!=!N)=!=!=!=!N)~!{!                                                                              ]!^!/!=!=!;!=!=!N);!=!=!=!M);!;!M)=!=!=!=!=!=!=!=!=!=!(!_!:!                                                                                        <!Q)P)N)=!=!M)=!=!=!=!=!=!=!=!=!=!=!N);!=!;!M)=!=!;!",
+"                                                [!}!|!-!-!=!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!1!2!                                                                                3!4!N)-!=!-!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!5!6!7!                                                                            8!9!0!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!=!-!-!-!a!b!)!c!                                                                                        d!6! !-!-!=!-!-!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!",
+"                                                e!f!g!h!i!j!j!k!j!j!l!-!j!l!l!j!j!m!l!-!l!k!-!n!o!                                                                              p!q!r!s!i!j!m!t!j!j!-!j!t!j!j!j!i!i!-!j!i!j!t!i!j!t!i!j!u!v!w!                                                                            x!y!z!t!j!-!j!l!k!-!j!i!a!A!k!j!j!i!i!i!B!j!j!j!l!-!j!l!C!D!E!                                                                                      F!G!H!k!i!j!i!m!j!j!l!-!j!j!-!t!j!I!l!J!k!l!-!m!K!",
+"                                                L!M!N!O!m!P!Q!P!s!R!R!R!Q!Q!R!Q!m!R!R!m!P!R!R!B!S!T!                                                                              U!V!W!P!R!Q!s!R!X!m!Q!Q!P!R!P!Q!R!Y!P!Q!R!s!P!R!P!P!s!Q!Z!`! ~                                                                            .~+~I!m!i!R!@~#~Y!$~P!Q!k!R!Q!Q!P!s!R!R!Y!R!%~R!#~P!Q!s!&~*~                                                                                        =~-~C!Y!Q!R!m!P!Q!P!m!O!Q!P!Q!Q!P!R!R!R!R!i!k!R!",
+"                                                ;~>~,~'~'~)~!~~~'~'~O!'~)~)~)~{~%~{~'~'~Q!'~]~%~^~/~(~                                                                              _~:~<~{~%~{~)~)~R!~~)~'~[~'~)~{~{~O!'~}~O!)~'~'~O!{~~~'~|~1~                                                                              T!2~P!'~3~)~[~!~R!{~~~)~)~~~4~R!{~)~{~{~}~{~)~'~O!'~)~5~6~7~                                                                                        8~9~^~}~)~'~O!)~O!R!!~)~!~{~)~'~{~%~)~)~!~#~4~",
+"                                                0~1~a~b~c~d~c~e~f~e~e~g~e~e~c~c~f~c~e~e~c~e~[~b~e~h~i~j~                                                                              k~l~m~g~c~e~e~e~e~e~c~c~f~c~n~g~c~c~o~e~b~e~p~e~c~d~e~o~q~r~                                                                            s~t~u~{~p~n~c~f~c~c~e~b~c~v~f~e~f~d~c~c~d~w~d~e~e~b~f~x~y~z~A~                                                                                        B~C~D~n~c~e~e~e~e~e~d~e~c~e~c~c~f~f~o~e~c~f~",
+"                                                E~F~G~H~I~I~J~I~I~J~I~I~I~I~I~I~I~I~c~c~I~I~f~I~I~K~L~M~                                                                                N~O~P~I~I~I~J~I~J~J~I~J~I~c~f~I~I~Q~c~I~I~I~I~J~I~J~I~K~R~S~                                                                            T~U~,~J~J~I~I~I~I~c~Q~I~I~I~I~I~J~I~I~I~I~J~I~I~I~I~I~I~D~V~W~                                                                                        t~X~K~I~I~I~I~I~J~I~I~I~J~I~I~I~I~Q~f~J~J~",
+"                                              Y~Z~`~J~ { { { { { { {I~ { { { { { { { { {I~ { {I~ { {.{+{@{                                                                              #{${%{J~ { {I~ { { { { { { { {c~ { { {I~ { { { { { {H~ {d~&{*{                                                                            ={-{m~ { { {J~ { {J~H~ { {I~ { { { { { {I~ { { { { { { {;{>{                                                                                        ,{'{){.{ { { { {!{~{ { { { { {I~ { { {c~ {",
+"                                                {{]{^{/{!{/{/{!{/{!{/{/{!{!{!{!{!{/{!{!{/{/{!{!{!{!{/{({_{:{                                                                              <{[{}{/{/{!{!{/{/{/{!{!{/{/{/{!{!{!{!{!{!{!{!{!{/{/{!{|{1{2{3{                                                                            4{5{^{/{!{!{/{!{/{!{/{!{/{!{/{/{!{!{/{!{/{!{!{!{!{/{!{|{6{7{                                                                                        8{9{0{|{!{!{!{!{!{/{/{!{!{/{!{!{/{/{!{!{",
+"                                                a{b{c{d{e{f{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{({g{h{                                                                              i{j{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{l{m{                                                                              n{o{|{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{d{d{d{d{p{q{r{                                                                                        s{t{({u{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{",
+"                                                  v{w{x{y{y{y{y{y{y{z{y{y{y{y{A{y{y{A{y{y{B{z{y{y{y{y{y{C{D{E{F{                                                                              G{H{I{y{y{y{y{y{J{y{J{A{y{K{y{y{y{y{y{y{y{y{y{z{y{y{y{z{L{M{                                                                            N{O{P{Q{y{y{y{z{C{y{y{y{y{y{y{y{y{y{z{y{y{y{y{A{y{y{y{z{R{S{T{                                                                                        U{V{R{J{J{y{y{A{y{y{y{A{y{y{J{z{y{C{",
+"                                                    W{X{Y{Z{K{K{`{ ]Z{K{`{K{`{.]`{+]Z{`{Z{@].]K{Z{#]K{ ] ]@]$]%]                                                                              &]*]=]C{`{K{-];]`{-]-]K{`{K{@]K{-]`{K{`{K{@]`{K{#]K{`{Z{C{>],]                                                                            '])]x{@]-]`{;]K{.]K{#]@]K{ ]C{`{`{.]+]K{;]-]K{@].]`{`{K{!]~]{]                                                                                      ]]^]/]C{-]`{+]Z{`{K{-]@]K{-]`{-].]K{",
+"                                                      (]_]:]<]<][]<]<]+]<]<]}]|][]-]-]<]-]@]<]<]+]<]<]<][]<]Z{1]2]                                                                              3]4]5]6]<]Z{+]<]7]+]<][]K{<]<]-]}]<][]<]<][]-]<]<][]Z{8]C{9]0]                                                                            a]b]c]@][]<]@]+]<]<]<]<][]<]<]<]<]+]<]+]-]<]<]|][]<]@]|]d]e]                                                                                        f]g]h]-][][]Z{[]<]-]}]<]@]<]<]+]K{",
+"                                                      i]j]k]l]m]m]m]m]m]n]m]n]m]n]n]n]n]n]n]m]m]m]m]m]n]m]m]m]l]o]p]                                                                              q]r]s]n]n]m]m]m]m]n]m][]m]m]n]n]n]n]m]m]m]n]m]m]m]n]n]t]u]r]v]                                                                            w]x]y]m]m]n]m]n]n]m]m]m]m]n]m]m]z]m]m]n]n]m]m]m]m]n]m]n]A]B]                                                                                        C]D]E]n]n][]n]m]n]n]n]F]n]m]m]n]",
+"                                                        G]H]I]J]K]K]K]L]K]K]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]M]N]O]P]                                                                              Q]R]N]S]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]K]n]K]J]T]U]                                                                              V]W]X]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]n]K]K]K]K]K]K]K]n]W]Y]                                                                                        Z]`] ^K]L]K]K]K]m]K]K]K]K]K]K]",
+"                                                          .^+^@^K]L]K]m]L]L]L]L]L]L]L]L]L]K]K]L]K]L]L]L]L]L]L]n]M]#^$^%^                                                                              &^*^=^L]L]L]L]K]L]m]L]L]K]L]L]L]K]L]L]m]-^L]L]L]L]L];^K]>^j]                                                                            ,^'^)^!^-^-^L]L]L]L]L]K]L]L]K]K]L]L]L]L]L]L]L]L]K]~^L]L]{^]^^^                                                                                        /^(^S]K]L]L]L]L]L]L]L]K]K]K]",
+"                                                            _^:^<^[^[^}^[^|^1^|^1^L]|^1^1^}^|^|^L]1^2^|^1^1^|^}^[^1^y]3^                                                                              4^5^6^L]1^2^1^1^|^L]1^L][^1^2^|^1^[^|^7^[^|^1^|^1^L]1^1^M]8^9^                                                                            0^a^b^c^1^2^|^2^1^c^1^[^|^[^}^[^1^|^1^1^;^|^1^1^7^2^|^c^b^d^e^                                                                                      f^g^h^i^j^[^2^|^[^L]1^1^1^c^",
+"                                                              k^l^m^n^o^o^p^p^q^r^r^o^q^p^r^o^o^o^s^o^o^r^o^p^o^o^p^t^u^v^                                                                              w^x^y^[^r^p^r^o^o^r^o^o^[^o^o^o^o^p^o^o^p^p^p^q^r^p^r^p^i^z^A^                                                                            B^C^D^t^o^o^r^s^E^o^o^p^p^o^o^p^p^r^q^r^o^F^o^q^o^o^r^t^y^G^                                                                                        H^I^J^t^o^o^r^o^o^t^p^p^o^",
+"                                                              K^L^M^p^F^o^p^p^p^p^n^N^o^N^p^p^p^o^O^p^P^o^p^p^o^o^p^p^F^Q^R^                                                                              S^T^U^p^N^o^N^o^p^p^N^O^p^N^p^o^p^t^o^p^p^p^p^p^V^o^O^t^W^X^Y^                                                                            Z^`^F^p^p^o^O^ /p^o^p^p^o^o^./p^o^p^O^N^./o^p^p^p^o^ /n^+/L^                                                                                        @/#/$/p^./%/o^o^ /p^N^o^",
+"                                                                H^&/*/n^O^n^n^ /././=/ /=/ / /=/n^-/ /;/>/ /n^n^O^n^O^n^,/'/)/                                                                              !/~/{/-/ /=/ / / /;/=/./=/ /=/O^N^O^O^ /O^./ /=/./=/./ /]/^/                                                                              //(/p^-/ /-/_/./O^O^n^n^n^ /=/ / /_/=/=/./././=/ /:/</[/}/|/                                                                                        1/2/3/>/</./ /./>/=/ /",
+"                                                                  4/5/6/7/8/9/8/8/-/-/9/0/a/>/0/7/9/7/9/7/7/7/8/7/8/b/c/9/d/e/f/                                                                              g/h/_/8/0/-/./i/0/b/7/9/7/0/7/9/8/7/9/8/9/8/9/-/0/-/_/-/j/k/                                                                            l/m/n/>/7/9/8/7/7/7/8/9/0/-/7/9/8/-/-/7/7/ /b/0/7/o/c/9/p/q/r/                                                                                        s/h/t/7/8/9/-/9/7/-/",
+"                                                                    u/v/t/w/x/y/0/0/y/y/y/z/y/y/y/0/0/x/A/7/y/0/0/y/x/z/0/9/B/C/                                                                              D/E/F/z/x/0/z/x/y/G/7/y/x/0/y/z/0/y/y/y/0/0/H/y/y/0/H/I/J/K/L/                                                                            M/N/O/0/-/y/y/0/y/x/0/0/0/y/z/0/0/y/x/z/0/x/y/z/9/y/x/z/P/Q/R/                                                                                      S/E/n/T/0/0/y/y/H/0/",
+"                                                                      U/V/W/x/x/x/X/x/x/Y/X/x/X/Z/x/`/ (x/x/`/w/`/x/x/x/x/X/.(V/+(                                                                              @(#($(%(Z/x/`/X/X/`/X/y/x/x/w/x/`/x/y/x/X/`/x/x/X/x/&(Z/*(5/=(                                                                            -(;(>(`/X/x/x/x/y/w/`/x/`/`/`/X/x/X/Z/`/`/X/X/`/X/x/x/,('()(                                                                                        !(~(P/.(Z/x/x/Z/X/",
+"                                                                      {(](^(Z//(((((_(((:(((_(((:(((_(:(<([(((Z/_(_(((<(((((}(I/|(1(                                                                              2(3(4(((((_(Z/((_(((X/_(_(Z/((_(((Z/((((_(((:(((((((:(((5(6(                                                                              7(8(%(_(X/_(9(((Z/[(((_(((((((((:(:(((_(((Z/[(_(X/_(0(%(a(b(                                                                                        c(d(e(((((((X/((",
+"                                                                        f(g(h(i(j([(k([(_([(l(m(_(_(n(_(9(n([(_(n(o([(i([(n(p(o(q(r(s(                                                                              t(u(v(l(n(_(w(w(_([(n([(_([([([(p([([(x(n(_([([(y((([(w(z(A(                                                                            D/B(z(_(9([(i(_(_(k([(k(n([([([(_(_(_(k(_([(k([([(n(w([(C(D(E(                                                                                        F(G((([(l(<([(",
+"                                                                          H(I(J(K(L(L(L(M(N(n(p(O(p(M(P(L(Q(L(i(N(i(i(L(L(L(L(L(N(R(S(                                                                                T(U(n(L(O(K(V(N(O(W(i(i(W(p(L(L(L(L(L(L(L(V(p(w(X(K(L(Y(Z(`(                                                                             _._+_@_P(k(i(i(L(i(L(L(L(L(L(L(V(L(L(L(V(K(M(O(N(p(p(M(#_$_%_                                                                                        &_*_n(k(M(X(",
+"                                                                            =_-_Y(;_;_>_,_,_P('_)_;_;_,_>_,_;_O(!_,_;_;_;_;_;_,_,_>_~_{_                                                                              ]_^_/_P((_;_,_,_O(;_,_O(__,_;_;_,_;_,_O('_;_'_@_,_;_,_,_k(:_<_                                                                            [_}_|_(_,_;_>_,_,_;_;_,_,_;_>_,_;_O(,_>_;_)_1_,_,_;_2_,_3_4_5_                                                                                      6_7_8_L(,_;_",
+"                                                                              9_0_a_b_!_1_)_c_1_,_b_)_,_!_c_1_,_b_d_(_!_,_)_b_,_1_e_(_f_g_                                                                              h_4_i_a_b_e_,_,_c_d_>_!_b_1_!_)_,_!_b_1_,_c_d_1_!_)_)_)_j_k_l_                                                                            m_n_o_p_1_e_b_e_!_)_1_e_c_1_1_p_b_>_)_p_,_)_b_e_1_e_c_q_r_s_                                                                                        t_u_v_N(!_",
+"                                                                              w_x_y_z_z_A_!_B_b_c_c_C_p_b_b_b_b_b_b_D_B_c_b_E_F_C_!_z_G_H_I_                                                                              J_K_L_M_B_b_b_b_b_p_b_p_b_E_C_c_b_F_B_b_c_A_N_c_B_b_p_p_O_P_                                                                              T(Q_R_S_b_b_b_N_C_C_c_F_B_C_c_C_b_E_B_B_p_b_b_b_b_b_p_p_T_U_                                                                                        V_W_X_E_",
+"                                                                                Y_Z_`_c_ :.:b_+:@:S_@:#:.:@:$:%:&:@:F_z_+:S_F_E_*:+:!_=:-:;:>:                                                                              ,:':):!:~:.:$:%:.:E_.:+:+:z_F_#:c_@:@:c_E_ :S_@:.:.:%:#:{:{_                                                                            ]:^:/:(:_:_:+:+:#:F_z_c_F_@:=:+:@:.:$:::.:S_@:+:~:z_+:#:<:[:,:                                                                                        }:|:1:",
+"                                                                                  2:3:4:5:6:7:8:9:0:a:b:c:d:e:8:c:f:0:g:0:h:d:e:i:6:7:j:k:l:m:                                                                                n:o:e:p:q:r:s:t:u:j:0:6:v:w:x:r:9:9:e:r:5:v:y:z:q:r:b:A:B:C:                                                                            D:E:F:G:g:v:d:f:b:v:H:v:5:I:7:g:d:J:p:K:r:r:7:8:u:v:x:u:L:M:N:                                                                                      O:P:Q:",
+"                                                                                    R:S:T:U:U:V:W:V:8:X:5:V:W:W:Y:5:5:V:V:Z:`:V:V:V:U:U:V: <.<+<                                                                              @<#<$<X:Z:W:%<U:U:V:V:&<V:5:5:U:W:V:U:V:V:U:8:5:G:V:W:V:*<=<-<                                                                            ;<><,<V:U:&<X:V:5:'<V:V:U:5:U:i:Z:Z:i:V:Z:V:V:V:V:W:W:)<!<~<                                                                                        {<]<",
+"                                                                                    ^</<(<_<:<Y:W:<<<<:<'<'<[<Y:V:'<U:W:Y:Z:U:'<W:9:'<'<W:<<}<|<1<                                                                              2<3<4<5<'<:<:<V:U:'<U:Y:W:W:'<Y:_<Y:Y:W:'<<<:<'<Y:[<'<G:6<7<8<                                                                            9<0<*<'<U:U:U:Z:Y:'<_<V::<'<U:a<<<'<'<'<[<V:V:'<U:U:U:b<c<d<                                                                                        e<",
+"                                                                                      f<g<h<i<j<j<k<k<l<m<m<k<n<j<n<k<j<k<n<n<o<n<n<m<j<n<k<k<p<q<r<                                                                              s<t<u<v<n<m<j<j<k<n<m<m<j<k<j<m<n<m<j<m<o<j<j<m<m<n<j<j<w<x<                                                                              y<z<A<m<n<k<j<m<m<n<o<o<j<n<k<o<n<k<n<k<j<j<k<m<n<k<j<B<C<D<                                                                                        ",
+"                                                                                        E<F<G<H<I<J<K<L<M<H<N<N<I<N<H<M<l<N<H<I<H<L<M<H<K<N<H<L<O<P<Q<                                                                              R<S<T<N<U<M<J<N<J<l<L<U<I<J<I<K<H<M<J<K<N<I<H<N<H<K<N<V<W<X<                                                                            Y<Z<`<H<j< [.[L<M<M<l<N<N<K<L<M<H<N<H<H<N<K<H<H< [I<.[+[@[#[$[                                                                                      ",
+"                                                                                          %[&[*[l<H<N<L<L<.[M< [M<J<l< [H<J<N<I<l<K<M< [j<N<I<L<L<=[-[                                                                              ;[>[,[L<n<l<.[ [I<L<M<L<L<I<l<N<l<l<J<.[N<K<.[L<l<I<H< ['[)[![                                                                            ~[{[][K<N< [N<I<k<L<K<J<K<.[H<M<K<N<l<n<N<K< [K<N<I<N<^[/[([_[                                                                                    ",
+"                                                                                            :[<[[[}[M<U<}[U<}[L<|[U<J<U<1[K<2[}[H<+[U<}[ [U<M<U<}[H<3[4[                                                                              5[6[7[N<U<8[J<U<}[J<H<2[2[ [}[.[N<H<L<.[U<}[U<J<}[9[J<U<0[a[b[                                                                            c[d[e[U< [}[}[I<.[J<f[J<N<J<U<9[U<U<N<|[N<.[U<U<M<2[9[g[h[i[                                                                                    ",
+"                                                                                            j[k[l[9[m[n[9[|[m[o[p[o[q[n[2[m[r[8[o[p[r[s[r[8[r[t[9[u[v[w[x[                                                                              y[z[A[n[B[C[t[}[u[C[8[r[n[p[D[r[8[n[r[9[8[o[C[p[r[C[o[1[E[F[G[                                                                            H[I[J[r[r[r[o[8[n[B[8[9[r[B[p[t[s[B[u[C[s[2[8[s[K[p[s[p[L[M[                                                                                  ",
+"                                                                                              N[O[P[Q[R[D[S[S[n[C[T[C[B[S[U[V[q[Q[D[R[U[s[R[R[R[C[W[S[X[Y[Z[                                                                              `[ }.}T[R[q[o[V[T[D[V[C[S[V[S[D[R[T[C[R[R[r[B[T[q[r[S[V[+}@}                                                                              #}$}%}R[S[S[S[W[V[C[R[V[s[o[Q[s[p[S[V[S[B[R[&}S[S[S[S[%}*}=}                                                                                ",
+"                                                                                                -};}>},},},}&}s[&}'}V[T['})}'}&},}'},}'},})}&}&}'}&}&}C[!}~}                                                                                {}]},}&}&}'})})}&}'}R[)}&},}'}U[,},}'}&}D[Q['}T[V['})},}^}/}                                                                            (}_}:}<}[}R['}U['}&}'}'}}}&}&}Q[s[,},}&}&}[})},}'}W[,}&}|}1}2}                                                                              ",
+"                                                                                                  3}4}5}6})}7}[}8}7})})}7}V[7}[}9}T[U[7}[}Q['}6})}7}0}[}a}b}c}                                                                              d}e}f}g}9}9},}V['}0}&}}}9}8}}})}[}9})}8})}7}7})}9}9}&}&}h}i}j}                                                                            k}l}m}6})}R[,}8}9}6})}9}7}8}9}[}7})}9})}9}}}'}6})}R['}8}n};}o}                                                                            ",
+"                                                                                                    p}q},}9}r}9}8}s}t}8}7}8}t}8}t}u}t}s}8},}8}v}U[&}s}9}9}w}x}y}                                                                              z}A}B}C}8}D}t}t}s}u}t}s}r},}'}s}8},}v}u}7}t}s}u}7}7}t}0}E}F}G}                                                                            H}I}J}t}7}s}r}8}T[t}s})}s}u})}u}s}s}7}8}u}s}s}t}t}s}r}a}K}L}                                                                            ",
+"                                                                                                    M}N}O}s}r}9}8}r}s}u}s}P}Q}t}R}R}s}Q}S}s}s}T}U}v}T}8}r}r}V}W}X}                                                                              Y}Z}`}u}P} |t}P}S}r}v}S}.|t}Q}r}r}v}8}7}r}r}8}t}R}S}t}r}+|@|#|                                                                            $|%|Q}v}r}P}R}U}v}s}s}r}u}U[s}r}r}u}v} |r}&| |v}r}.|S}s}*|=|                                                                          ",
+"                                                                                                      -|;|>|S}v} |S}.|S}Q}R} |Q}T}P},|v}P}S},|P}'|)|P}S}'|)|P}!|~|{|                                                                              ]|^|/|T}.|S}&|P}S}P}T}P},|P}P}'| |v}S})|Q} |Q}P} |P}T}R}(|_|                                                                              :|<|R}S}v}P} |.|R},|,|Q}R}'|Q}.|S}P}S}S}T}U}P}S}T}T} |[|}|||                                                                        ",
+"                                                                                                        1|2|3| |4|5|4|6|)|7|8|4|,|7|8| |)|S}9|4|4|7|'| |9|9| |7|0|a|                                                                                b|c|d|8|9|,|7|4|6|)|.|9|)|'|7|5|)|e|e|)|9|'|7|f|e|,|7|5|g|h|                                                                            i|j|+|e|S}7|7|e|)|)|9|)|7|9|7|8|4|5|4|8|'|'|5|f|'|,|)|4|k|l|m|                                                                      ",
+"                                                                                                          n|o|p|6|4|6|9|4|6|e|'|q|4|R}4|r|5|9|r|4|5|9|9|9|5|4|4|7|s|t|                                                                              u|v|w|4|'|6|q| |7|q|7|4|q|q|)|4|e|9|4|4|e|4|9|9|)|8|8|P}x|y|z|                                                                            A|B|C|D|8|4|r|f|)|4|7|'|9|9|6|6|9|9|5|5|r| | |q|9|'|8|E|F|G|H|                                                                    ",
+"                                                                                                            I|J|K|L|M|M|M|M|M|r|N|O|9|r|O|M|M|M|r|M|M|E|P|M|q|O|Q|R|S|T|                                                                              U|V|W|E|r|M|8|8|M|M|M|O|r|M|O|q|Q|O|O|M|M|O|M|r|M|M|8|9|X|Y|Z|                                                                            `| 1.1q|O|Q|q|Q|O|q|r|+1O|M|M|M|M|M|r|O|r|8|O|M|M|M|L|N|@1#1                                                                    ",
+"                                                                                                            $1%1&1L|O|O|r|r|+1q|8|O|+1e|q|O|M|q|M|Q|r|q|Q|+1E|Q|M|r|*1=1-1                                                                              ;1>1,1'|r|+1q|5|O|O|q|r|O|M|8|O|Q|M|O|r|r|O|M|6|r|Q|8|e|'1)1                                                                              !1~1{1O|M|q|Q|Q|r|M|Q|M|O|r|r|M|+19|9|O|O|7|M|Q|M|q|Q|*1]1^1                                                                  ",
+"                                                                                                              /1(1_1+1:1+1+1P|P|:1+1+1:1:1Q|P|+1Q|M|Q|O|O|M|Q|P|+1Q|<1[1}1|1                                                                              112131P|Q|P|P|Q|P|+1:1Q|+1Q|Q|O|Q|:1P|Q|P|:1:1P|+1:1:1415161                                                                            71819141P|Q|Q|Q|+1O|Q|Q|P|:1:1+1P|:1:1Q|P|+1P|+1P|P|Q|Q|01a1b1                                                                ",
+"                                                                                                                c1d1[1P|:1:1+1P|e1P|M|P|f1:1:1f1e1f1:1f1f1f1f1f1f1:1+1g1h1i1                                                                                j1k1l1P|P|f1:1:1m1:1:1f1f1f1f1:1P|:1:1P|Q|f1:1O|+1f1<1<1n1o1                                                                            p1q1r1e1f1e1f1f1f1e1f1P|f1:1P|Q|:1e1:1Q|f1:1:1e1e1:1e1s1t1u1v1                                                              ",
+"                                                                                                                  w1x1y1m1m1m1m1z1z1f1m1A1m1f1e1m1z1e1A1A1z1m1A1A1m1z1z1B1C1D1                                                                              E1F1G1H1m1z1m1m1e1m1m1m1z1A1A1m1A1m1m1m1e1m1A1e1e1A1z1e1I1J1K1                                                                            L1M1N1e1A1A1e1A1A1e1m1m1m1m1m1m1A1m1m1z1m1m1e1e1m1m1m1z1O1P1Q1                                                            "};
diff --git a/net.mograsim.rcp/icons/app/ico_32t.png b/net.mograsim.rcp/icons/app/ico_32t.png
new file mode 100644 (file)
index 0000000..6dff716
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_32t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_48t.png b/net.mograsim.rcp/icons/app/ico_48t.png
new file mode 100644 (file)
index 0000000..692a991
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_48t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_64t.png b/net.mograsim.rcp/icons/app/ico_64t.png
new file mode 100644 (file)
index 0000000..338d6ca
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_64t.png differ
diff --git a/net.mograsim.rcp/icons/app/ico_all.ico b/net.mograsim.rcp/icons/app/ico_all.ico
new file mode 100644 (file)
index 0000000..b6884e1
Binary files /dev/null and b/net.mograsim.rcp/icons/app/ico_all.ico differ
diff --git a/net.mograsim.rcp/icons/embedded.png b/net.mograsim.rcp/icons/embedded.png
new file mode 100644 (file)
index 0000000..57edc6a
Binary files /dev/null and b/net.mograsim.rcp/icons/embedded.png differ
diff --git a/net.mograsim.rcp/icons/enterprise.png b/net.mograsim.rcp/icons/enterprise.png
new file mode 100644 (file)
index 0000000..7fe2f5c
Binary files /dev/null and b/net.mograsim.rcp/icons/enterprise.png differ
diff --git a/net.mograsim.rcp/icons/home.png b/net.mograsim.rcp/icons/home.png
new file mode 100644 (file)
index 0000000..e9ace41
Binary files /dev/null and b/net.mograsim.rcp/icons/home.png differ
diff --git a/net.mograsim.rcp/icons/languages.png b/net.mograsim.rcp/icons/languages.png
new file mode 100644 (file)
index 0000000..98af2da
Binary files /dev/null and b/net.mograsim.rcp/icons/languages.png differ
diff --git a/net.mograsim.rcp/icons/open_in_app.png b/net.mograsim.rcp/icons/open_in_app.png
new file mode 100644 (file)
index 0000000..9df4eeb
Binary files /dev/null and b/net.mograsim.rcp/icons/open_in_app.png differ
diff --git a/net.mograsim.rcp/icons/rcp.png b/net.mograsim.rcp/icons/rcp.png
new file mode 100644 (file)
index 0000000..b248ca2
Binary files /dev/null and b/net.mograsim.rcp/icons/rcp.png differ
diff --git a/net.mograsim.rcp/icons/save_edit.png b/net.mograsim.rcp/icons/save_edit.png
new file mode 100644 (file)
index 0000000..b17caf5
Binary files /dev/null and b/net.mograsim.rcp/icons/save_edit.png differ
diff --git a/net.mograsim.rcp/net.mograsim.rcp.product b/net.mograsim.rcp/net.mograsim.rcp.product
new file mode 100644 (file)
index 0000000..829a7b5
--- /dev/null
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="Simulator WIP" uid="sample" id="net.mograsim.rcp.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+   <aboutInfo>
+      <text>
+         Example
+      </text>
+   </aboutInfo>
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-clearPersistedState
+      </programArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+      </vmArgsMac>
+   </launcherArgs>
+
+   <windowImages i16="/net.mograsim.rcp/icons/app/ico_16t.png" i32="/net.mograsim.rcp/icons/app/ico_32t.png" i48="/net.mograsim.rcp/icons/app/ico_48t.png" i64="/net.mograsim.rcp/icons/app/ico_64t.png" i128="/net.mograsim.rcp/icons/app/ico_128t.png" i256="/net.mograsim.rcp/icons/app/ico_256t.png"/>
+
+   <splash
+      handlerType="extensible" />
+   <launcher name="Sample">
+      <linux icon="/net.mograsim.rcp/icons/app/ico_256t.xpm"/>
+      <macosx icon="/net.mograsim.rcp/icons/app/ico_256t.icns"/>
+      <win useIco="true">
+         <ico path="/net.mograsim.rcp/icons/app/ico_all.ico"/>
+         <bmp/>
+      </win>
+   </launcher>
+
+
+   <vm>
+      <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</linux>
+      <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</macos>
+      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</windows>
+   </vm>
+
+   <license>
+        <url>https://www.eclipse.org/legal/epl-2.0/</url>
+        <text>
+   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
+         </text>
+   </license>
+
+   <plugins>
+      <plugin id="SWTBufferedCanvas"/>
+      <plugin id="SWTObjectWrappers"/>
+      <plugin id="SWTZoomableCanvas"/>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="javax.annotation"/>
+      <plugin id="javax.inject"/>
+      <plugin id="javax.xml"/>
+      <plugin id="net.mograsim.logic.core"/>
+      <plugin id="net.mograsim.logic.ui"/>
+      <plugin id="net.mograsim.rcp"/>
+      <plugin id="org.apache.batik.constants"/>
+      <plugin id="org.apache.batik.css"/>
+      <plugin id="org.apache.batik.i18n"/>
+      <plugin id="org.apache.batik.util"/>
+      <plugin id="org.apache.commons.io"/>
+      <plugin id="org.apache.commons.jxpath"/>
+      <plugin id="org.apache.commons.logging"/>
+      <plugin id="org.apache.xmlgraphics"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.databinding.observable"/>
+      <plugin id="org.eclipse.core.databinding.property"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.e4.core.commands"/>
+      <plugin id="org.eclipse.e4.core.contexts"/>
+      <plugin id="org.eclipse.e4.core.di"/>
+      <plugin id="org.eclipse.e4.core.di.annotations"/>
+      <plugin id="org.eclipse.e4.core.di.extensions"/>
+      <plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
+      <plugin id="org.eclipse.e4.core.services"/>
+      <plugin id="org.eclipse.e4.emf.xpath"/>
+      <plugin id="org.eclipse.e4.ui.bindings"/>
+      <plugin id="org.eclipse.e4.ui.css.core"/>
+      <plugin id="org.eclipse.e4.ui.css.swt"/>
+      <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+      <plugin id="org.eclipse.e4.ui.di"/>
+      <plugin id="org.eclipse.e4.ui.model.workbench"/>
+      <plugin id="org.eclipse.e4.ui.services"/>
+      <plugin id="org.eclipse.e4.ui.widgets"/>
+      <plugin id="org.eclipse.e4.ui.workbench"/>
+      <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench3"/>
+      <plugin id="org.eclipse.emf.common"/>
+      <plugin id="org.eclipse.emf.ecore"/>
+      <plugin id="org.eclipse.emf.ecore.change"/>
+      <plugin id="org.eclipse.emf.ecore.xmi"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.region" fragment="true"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.equinox.supplement"/>
+      <plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
+      <plugin id="org.eclipse.equinox.weaving.hook" fragment="true"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
+      <plugin id="org.eclipse.osgi.services"/>
+      <plugin id="org.eclipse.osgi.util"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+      <plugin id="org.w3c.css.sac"/>
+      <plugin id="org.w3c.dom.events"/>
+      <plugin id="org.w3c.dom.smil"/>
+      <plugin id="org.w3c.dom.svg"/>
+   </plugins>
+
+   <configurations>
+      <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
+   </configurations>
+
+   <preferencesInfo>
+      <targetfile overwrite="false"/>
+   </preferencesInfo>
+
+   <cssInfo>
+      <file path="/net.mograsim.rcp/css/default.css"/>
+   </cssInfo>
+
+</product>
diff --git a/net.mograsim.rcp/plugin.xml b/net.mograsim.rcp/plugin.xml
new file mode 100644 (file)
index 0000000..a22663b
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension-point id="splashExtension" name="%extension-point.name" schema="schema/splashExtension.exsd"/>
+
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.e4.ui.workbench.swt.E4Application"
+            name="Simulator WIP">
+         <property
+               name="applicationCSS"
+               value="platform:/plugin/net.mograsim.rcp/css/default.css">
+         </property>
+         <property
+               name="appName"
+               value="Simulator WIP">
+         </property>
+         <property
+               name="windowImages"
+               value="icons/app/ico_16t.png,icons/app/ico_32t.png,icons/app/ico_48t.png,icons/app/ico_64t.png,icons/app/ico_128t.png,icons/app/ico_256t.png">
+         </property>
+         <property
+               name="aboutText"
+               value="Example">
+         </property>
+      </product>
+   </extension>
+   <extension
+         point="org.eclipse.ui.splashHandlers">
+      <splashHandler
+            class="net.mograsim.rcp.splashhandlers.ExtensibleSplashHandler"
+            id="net.mograsim.rcp.splashHandlers.extensible">
+      </splashHandler>
+      <splashHandlerProductBinding
+            productId="net.mograsim.rcp.product"
+            splashId="net.mograsim.rcp.splashHandlers.extensible">
+      </splashHandlerProductBinding>
+   </extension>
+   <extension
+         point="net.mograsim.rcp.splashExtension">
+      <splashExtension
+            icon="icons/af.png"
+            id="af"
+            tooltip="Application Framework">
+      </splashExtension>
+      <splashExtension
+            icon="icons/embedded.png"
+            id="embedded"
+            tooltip="Embedded">
+      </splashExtension>
+      <splashExtension
+            icon="icons/enterprise.png"
+            id="enterprise"
+            tooltip="Enterprise">
+      </splashExtension>
+      <splashExtension
+            icon="icons/languages.png"
+            id="languages"
+            tooltip="Languages">
+      </splashExtension>
+      <splashExtension
+            icon="icons/rcp.png"
+            id="rcp"
+            tooltip="RCP">
+      </splashExtension>
+   </extension>
+
+</plugin>
diff --git a/net.mograsim.rcp/schema/splashExtension.exsd b/net.mograsim.rcp/schema/splashExtension.exsd
new file mode 100644 (file)
index 0000000..ea0d2b5
--- /dev/null
@@ -0,0 +1,124 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="Sample">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="Sample" id="splashExtension" name="Splash Extensions"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="splashExtension"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="splashExtension">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="id" icon="icon"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="icon" type="string" use="required">
+            <annotation>
+               <documentation>
+                  50x50 icon
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="resource"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="tooltip" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/net.mograsim.rcp/splash.bmp b/net.mograsim.rcp/splash.bmp
new file mode 100644 (file)
index 0000000..6a5df0a
Binary files /dev/null and b/net.mograsim.rcp/splash.bmp differ
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/handlers/AboutHandler.java b/net.mograsim.rcp/src/net/mograsim/rcp/handlers/AboutHandler.java
new file mode 100644 (file)
index 0000000..25a6663
--- /dev/null
@@ -0,0 +1,14 @@
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class AboutHandler
+{
+       @Execute
+       public void execute(Shell shell)
+       {
+               MessageDialog.openInformation(shell, "About", "Sample RCP4");
+       }
+}
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/handlers/OpenHandler.java b/net.mograsim.rcp/src/net/mograsim/rcp/handlers/OpenHandler.java
new file mode 100644 (file)
index 0000000..7df311a
--- /dev/null
@@ -0,0 +1,16 @@
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class OpenHandler
+{
+
+       @Execute
+       public void execute(Shell shell)
+       {
+               FileDialog dialog = new FileDialog(shell);
+               dialog.open();
+       }
+}
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/handlers/QuitHandler.java b/net.mograsim.rcp/src/net/mograsim/rcp/handlers/QuitHandler.java
new file mode 100644 (file)
index 0000000..c953e5a
--- /dev/null
@@ -0,0 +1,18 @@
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.workbench.IWorkbench;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class QuitHandler
+{
+       @Execute
+       public void execute(IWorkbench workbench, Shell shell)
+       {
+               if (MessageDialog.openConfirm(shell, "Confirmation", "Do you want to exit?"))
+               {
+                       workbench.close();
+               }
+       }
+}
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/handlers/SaveHandler.java b/net.mograsim.rcp/src/net/mograsim/rcp/handlers/SaveHandler.java
new file mode 100644 (file)
index 0000000..e662d6b
--- /dev/null
@@ -0,0 +1,25 @@
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+
+public class SaveHandler
+{
+
+       @CanExecute
+       public boolean canExecute(EPartService partService)
+       {
+               if (partService != null)
+               {
+                       return !partService.getDirtyParts().isEmpty();
+               }
+               return false;
+       }
+
+       @Execute
+       public void execute(EPartService partService)
+       {
+               partService.saveAll(false);
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/parts/LogicUIPart.java b/net.mograsim.rcp/src/net/mograsim/rcp/parts/LogicUIPart.java
new file mode 100644 (file)
index 0000000..d23c9f4
--- /dev/null
@@ -0,0 +1,54 @@
+package net.mograsim.rcp.parts;
+
+import javax.annotation.PostConstruct;
+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 net.mograsim.logic.ui.LogicExecuter;
+import net.mograsim.logic.ui.LogicUICanvas;
+import net.mograsim.logic.ui.examples.RSLatchExample;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
+import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
+import net.mograsim.logic.core.timeline.Timeline;
+
+public class LogicUIPart
+{
+       @Inject
+       private MPart part;
+
+       @PostConstruct
+       public void create(Composite parent)
+       {
+               // setup view model
+               ViewModel viewModel = new ViewModel();
+               RSLatchExample.createRSLatchExample(viewModel);
+
+               // convert to logic model
+               LogicModelParameters params = new LogicModelParameters();
+               params.gateProcessTime = 50;
+               params.wireTravelTime = 10;
+               Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
+
+               // initialize UI
+               LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE, viewModel);
+               ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
+               ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
+               userInput.buttonDrag = 3;
+               userInput.buttonZoom = 2;
+               userInput.enableUserInput();
+
+               // initialize executer
+               LogicExecuter exec = new LogicExecuter(timeline);
+
+               // run it
+               exec.startLiveExecution();
+
+               // TODO find a better condition when to stop
+               ui.addDisposeListener(e -> exec.stopLiveExecution());
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/parts/SamplePart.java b/net.mograsim.rcp/src/net/mograsim/rcp/parts/SamplePart.java
new file mode 100644 (file)
index 0000000..0bbe8aa
--- /dev/null
@@ -0,0 +1,61 @@
+package net.mograsim.rcp.parts;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.Persist;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+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.Text;
+
+public class SamplePart
+{
+
+       private TableViewer tableViewer;
+
+       @Inject
+       private MPart part;
+
+       @PostConstruct
+       public void createComposite(Composite parent)
+       {
+               parent.setLayout(new GridLayout(1, false));
+
+               Text txtInput = new Text(parent, SWT.BORDER);
+               txtInput.setMessage("Enter text to mark part as dirty");
+               txtInput.addModifyListener(e -> part.setDirty(true));
+               txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               tableViewer = new TableViewer(parent);
+
+               tableViewer.setContentProvider(ArrayContentProvider.getInstance());
+               tableViewer.setInput(createInitialDataModel());
+               tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
+       }
+
+       @Focus
+       public void setFocus()
+       {
+               tableViewer.getTable().setFocus();
+       }
+
+       @Persist
+       public void save()
+       {
+               part.setDirty(false);
+       }
+
+       private static List<String> createInitialDataModel()
+       {
+               return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");
+       }
+}
\ No newline at end of file
diff --git a/net.mograsim.rcp/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java b/net.mograsim.rcp/src/net/mograsim/rcp/splashhandlers/ExtensibleSplashHandler.java
new file mode 100644 (file)
index 0000000..17d4ea5
--- /dev/null
@@ -0,0 +1,328 @@
+package net.mograsim.rcp.splashhandlers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.splash.AbstractSplashHandler;
+
+/**
+ * @since 3.3
+ *
+ */
+public class ExtensibleSplashHandler extends AbstractSplashHandler
+{
+
+       private ArrayList<Image> fImageList;
+
+       private ArrayList<String> fTooltipList;
+
+       private static final String F_SPLASH_EXTENSION_ID = "Sample.splashExtension"; // NON-NLS-1
+
+       private static final String F_ELEMENT_ICON = "icon"; // NON-NLS-1
+
+       private static final String F_ELEMENT_TOOLTIP = "tooltip"; // NON-NLS-1
+
+       private static final String F_DEFAULT_TOOLTIP = "Image"; // NON-NLS-1
+
+       private static final int F_IMAGE_WIDTH = 50;
+
+       private static final int F_IMAGE_HEIGHT = 50;
+
+       private static final int F_SPLASH_SCREEN_BEVEL = 5;
+
+       private Composite fIconPanel;
+
+       /**
+        * 
+        */
+       public ExtensibleSplashHandler()
+       {
+               fImageList = new ArrayList<>();
+               fTooltipList = new ArrayList<>();
+               fIconPanel = null;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets. Shell)
+        */
+       @Override
+       public void init(Shell splash)
+       {
+               // Store the shell
+               super.init(splash);
+               // Configure the shell layout
+               configureUISplash();
+               // Load all splash extensions
+               loadSplashExtensions();
+               // If no splash extensions were loaded abort the splash handler
+               if (!hasSplashExtensions())
+               {
+                       return;
+               }
+               // Create UI
+               createUI();
+               // Configure the image panel bounds
+               configureUICompositeIconPanelBounds();
+               // Enter event loop and prevent the RCP application from
+               // loading until all work is done
+               doEventLoop();
+       }
+
+       /**
+        * @return
+        */
+       private boolean hasSplashExtensions()
+       {
+               return !fImageList.isEmpty();
+       }
+
+       /**
+        * 
+        */
+       private void createUI()
+       {
+               // Create the icon panel
+               createUICompositeIconPanel();
+               // Create the images
+               createUIImages();
+       }
+
+       /**
+        * 
+        */
+       private void createUIImages()
+       {
+               Iterator<Image> imageIterator = fImageList.iterator();
+               Iterator<String> tooltipIterator = fTooltipList.iterator();
+               int i = 1;
+               int columnCount = ((GridLayout) fIconPanel.getLayout()).numColumns;
+               // Create all the images
+               // Abort if we run out of columns (left-over images will not fit within
+               // the usable splash screen width)
+               while (imageIterator.hasNext() && (i <= columnCount))
+               {
+                       Image image = imageIterator.next();
+                       String tooltip = tooltipIterator.next();
+                       // Create the image using a label widget
+                       createUILabel(image, tooltip);
+                       i++;
+               }
+       }
+
+       /**
+        * @param image
+        * @param tooltip
+        */
+       private void createUILabel(Image image, String tooltip)
+       {
+               // Create the label (no text)
+               Label label = new Label(fIconPanel, SWT.NONE);
+               label.setImage(image);
+               label.setToolTipText(tooltip);
+       }
+
+       /**
+        * 
+        */
+       private void createUICompositeIconPanel()
+       {
+               Shell splash = getSplash();
+               // Create the composite
+               fIconPanel = new Composite(splash, SWT.NONE);
+               // Determine the maximum number of columns that can fit on the splash
+               // screen. One 50x50 image per column.
+               int maxColumnCount = getUsableSplashScreenWidth() / F_IMAGE_WIDTH;
+               // Limit size to the maximum number of columns if the number of images
+               // exceed this amount; otherwise, use the exact number of columns
+               // required.
+               int actualColumnCount = Math.min(fImageList.size(), maxColumnCount);
+               // Configure the layout
+               GridLayout layout = new GridLayout(actualColumnCount, true);
+               layout.horizontalSpacing = 0;
+               layout.verticalSpacing = 0;
+               layout.marginHeight = 0;
+               layout.marginWidth = 0;
+               fIconPanel.setLayout(layout);
+       }
+
+       /**
+        * 
+        */
+       private void configureUICompositeIconPanelBounds()
+       {
+               // Determine the size of the panel and position it at the bottom-right
+               // of the splash screen.
+               Point panelSize = fIconPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+
+               int xCoord = getSplash().getSize().x - F_SPLASH_SCREEN_BEVEL - panelSize.x;
+               int yCoord = getSplash().getSize().y - F_SPLASH_SCREEN_BEVEL - panelSize.y;
+               int xWidth = panelSize.x;
+               int yWidth = panelSize.y;
+
+               fIconPanel.setBounds(xCoord, yCoord, xWidth, yWidth);
+       }
+
+       /**
+        * @return
+        */
+       private int getUsableSplashScreenWidth()
+       {
+               // Splash screen width minus two graphic border bevel widths
+               return getSplash().getSize().x - (F_SPLASH_SCREEN_BEVEL * 2);
+       }
+
+       /**
+        * 
+        */
+       private void loadSplashExtensions()
+       {
+               // Get all splash handler extensions
+               IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();
+               // Process all splash handler extensions
+               for (int i = 0; i < extensions.length; i++)
+               {
+                       processSplashExtension(extensions[i]);
+               }
+       }
+
+       /**
+        * @param extension
+        */
+       private void processSplashExtension(IExtension extension)
+       {
+               // Get all splash handler configuration elements
+               IConfigurationElement[] elements = extension.getConfigurationElements();
+               // Process all splash handler configuration elements
+               for (int j = 0; j < elements.length; j++)
+               {
+                       processSplashElements(elements[j]);
+               }
+       }
+
+       /**
+        * @param configurationElement
+        */
+       private void processSplashElements(IConfigurationElement configurationElement)
+       {
+               // Attribute: icon
+               processSplashElementIcon(configurationElement);
+               // Attribute: tooltip
+               processSplashElementTooltip(configurationElement);
+       }
+
+       /**
+        * @param configurationElement
+        */
+       private void processSplashElementTooltip(IConfigurationElement configurationElement)
+       {
+               // Get attribute tooltip
+               String tooltip = configurationElement.getAttribute(F_ELEMENT_TOOLTIP);
+               // If a tooltip is not defined, give it a default
+               if ((tooltip == null) || (tooltip.length() == 0))
+               {
+                       fTooltipList.add(F_DEFAULT_TOOLTIP);
+               } else
+               {
+                       fTooltipList.add(tooltip);
+               }
+       }
+
+       /**
+        * @param configurationElement
+        */
+       private void processSplashElementIcon(IConfigurationElement configurationElement)
+       {
+               // Get attribute icon
+               String iconImageFilePath = configurationElement.getAttribute(F_ELEMENT_ICON);
+               // Abort if an icon attribute was not specified
+               if ((iconImageFilePath == null) || (iconImageFilePath.length() == 0))
+               {
+                       return;
+               }
+               // Create a corresponding image descriptor
+               ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getNamespaceIdentifier(),
+                               iconImageFilePath);
+               // Abort if no corresponding image was found
+               if (descriptor == null)
+               {
+                       return;
+               }
+               // Create the image
+               Image image = descriptor.createImage();
+               // Abort if image creation failed
+               if (image == null)
+               {
+                       return;
+               }
+               // Abort if the image does not have dimensions of 50x50
+               if ((image.getBounds().width != F_IMAGE_WIDTH) || (image.getBounds().height != F_IMAGE_HEIGHT))
+               {
+                       // Dipose of the image
+                       image.dispose();
+                       return;
+               }
+               // Store the image and tooltip
+               fImageList.add(image);
+       }
+
+       /**
+        * 
+        */
+       private void configureUISplash()
+       {
+               // Configure layout
+               GridLayout layout = new GridLayout(1, true);
+               getSplash().setLayout(layout);
+               // Force shell to inherit the splash background
+               getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT);
+       }
+
+       /**
+        * 
+        */
+       private void doEventLoop()
+       {
+               Shell splash = getSplash();
+               if (!splash.getDisplay().readAndDispatch())
+               {
+                       splash.getDisplay().sleep();
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see org.eclipse.ui.splash.AbstractSplashHandler#dispose()
+        */
+       @Override
+       public void dispose()
+       {
+               super.dispose();
+               // Check to see if any images were defined
+               if ((fImageList == null) || fImageList.isEmpty())
+               {
+                       return;
+               }
+               // Dispose of all the images
+               Iterator<Image> iterator = fImageList.iterator();
+               while (iterator.hasNext())
+               {
+                       Image image = iterator.next();
+                       image.dispose();
+               }
+       }
+}