From 4b64bddbe0f166450270d3ced370707e7b3da528 Mon Sep 17 00:00:00 2001
From: tobia <tobia@Ryzen7Office.fritz.box>
Date: Tue, 31 Mar 2020 15:41:14 -0700
Subject: [PATCH] Initial move to NPS Gitlab

---
 Brennenstuhl/build.xml                        |   73 +
 Brennenstuhl/nbproject/build-impl.xml         | 1770 +++++++++++++++++
 Brennenstuhl/nbproject/genfiles.properties    |    8 +
 Brennenstuhl/nbproject/project.properties     |  113 ++
 Brennenstuhl/nbproject/project.xml            |   15 +
 Brennenstuhl/src/DISTools/Compressor.java     |  174 ++
 Brennenstuhl/src/DISTools/Coordinates.java    |   58 +
 Brennenstuhl/src/DISTools/EspduReceiver.java  |  111 ++
 Brennenstuhl/src/DISTools/EspduSender.java    |  361 ++++
 .../src/DISTools/PduListenerSaver.java        |   92 +
 .../src/DISTools/PduReaderPlayer.java         |   85 +
 Brennenstuhl/src/DISTools/PduReceiver.java    |   12 +
 Brennenstuhl/src/DISTools/Player.java         |  242 +++
 Brennenstuhl/src/DISTools/PlayerTobi.java     |  484 +++++
 Brennenstuhl/src/DISTools/Recorder.java       |  236 +++
 Brennenstuhl/src/DISTools/RecorderTobi.java   |  237 +++
 .../src/DISTools/SimpleSenderGUI.java         |  400 ++++
 .../src/DISTools/SimpleSenderGUIMain.java     |   31 +
 18 files changed, 4502 insertions(+)
 create mode 100644 Brennenstuhl/build.xml
 create mode 100644 Brennenstuhl/nbproject/build-impl.xml
 create mode 100644 Brennenstuhl/nbproject/genfiles.properties
 create mode 100644 Brennenstuhl/nbproject/project.properties
 create mode 100644 Brennenstuhl/nbproject/project.xml
 create mode 100644 Brennenstuhl/src/DISTools/Compressor.java
 create mode 100644 Brennenstuhl/src/DISTools/Coordinates.java
 create mode 100644 Brennenstuhl/src/DISTools/EspduReceiver.java
 create mode 100644 Brennenstuhl/src/DISTools/EspduSender.java
 create mode 100644 Brennenstuhl/src/DISTools/PduListenerSaver.java
 create mode 100644 Brennenstuhl/src/DISTools/PduReaderPlayer.java
 create mode 100644 Brennenstuhl/src/DISTools/PduReceiver.java
 create mode 100644 Brennenstuhl/src/DISTools/Player.java
 create mode 100644 Brennenstuhl/src/DISTools/PlayerTobi.java
 create mode 100644 Brennenstuhl/src/DISTools/Recorder.java
 create mode 100644 Brennenstuhl/src/DISTools/RecorderTobi.java
 create mode 100644 Brennenstuhl/src/DISTools/SimpleSenderGUI.java
 create mode 100644 Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java

diff --git a/Brennenstuhl/build.xml b/Brennenstuhl/build.xml
new file mode 100644
index 0000000..75987f5
--- /dev/null
+++ b/Brennenstuhl/build.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="Brennenstuhl" default="default" basedir=".">
+    <description>Builds, tests, and runs the project Brennenstuhl.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties
+      -post-init:                called after initialization of project properties
+      -pre-compile:              called before javac compilation
+      -post-compile:             called after javac compilation
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-jar:                  called before JAR building
+      -post-jar:                 called after JAR building
+      -post-clean:               called after cleaning build products
+
+    (Targets beginning with '-' are not intended to be called on their own.)
+
+    Example of inserting an obfuscator after compilation could look like this:
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Another way to customize the build is by overriding existing main targets.
+    The targets of interest are: 
+
+      -init-macrodef-javac:     defines macro for javac compilation
+      -init-macrodef-junit:     defines macro for junit execution
+      -init-macrodef-debug:     defines macro for class debugging
+      -init-macrodef-java:      defines macro for class execution
+      -do-jar:                  JAR building
+      run:                      execution of project 
+      -javadoc-build:           Javadoc generation
+      test-report:              JUnit report generation
+
+    An example of overriding the target for project execution could look like this:
+
+        <target name="run" depends="Brennenstuhl-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that the overridden target depends on the jar target and not only on 
+    the compile target as the regular run target does. Again, for a list of available 
+    properties which you can use, check the target you are overriding in the
+    nbproject/build-impl.xml file. 
+
+    -->
+</project>
diff --git a/Brennenstuhl/nbproject/build-impl.xml b/Brennenstuhl/nbproject/build-impl.xml
new file mode 100644
index 0000000..73b7328
--- /dev/null
+++ b/Brennenstuhl/nbproject/build-impl.xml
@@ -0,0 +1,1770 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - test compilation
+  - test execution
+  - test debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:if="ant:if" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" xmlns:unless="ant:unless" basedir=".." default="default" name="Brennenstuhl-impl">
+    <fail message="Please build using Ant 1.8.0 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.8.0"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.6"/>
+        <property name="default.javac.target" value="1.6"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target name="-init-modules-supported">
+        <condition property="modules.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-8](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-modulename">
+        <macrodef name="modulename" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute name="property"/>
+            <attribute name="sourcepath"/>
+            <sequential>
+                <loadresource property="@{property}" quiet="true">
+                    <javaresource classpath="@{sourcepath}" name="module-info.java" parentFirst="false"/>
+                    <filterchain>
+                        <stripjavacomments/>
+                        <linecontainsregexp>
+                            <regexp pattern="module .* \{"/>
+                        </linecontainsregexp>
+                        <tokenfilter>
+                            <linetokenizer/>
+                            <replaceregex flags="s" pattern="(\s*module\s+)(\S*)(\s*\{.*)" replace="\2"/>
+                        </tokenfilter>
+                        <striplinebreaks/>
+                    </filterchain>
+                </loadresource>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-modules-supported,-init-macrodef-modulename" if="modules.supported.internal" name="-init-source-module-properties">
+        <fail message="Java 9 support requires Ant 1.10.0 or higher.">
+            <condition>
+                <not>
+                    <antversion atleast="1.10.0"/>
+                </not>
+            </condition>
+        </fail>
+        <j2seproject3:modulename property="module.name" sourcepath="${src.dir}"/>
+        <condition property="named.module.internal">
+            <and>
+                <isset property="module.name"/>
+                <length length="0" string="${module.name}" when="greater"/>
+            </and>
+        </condition>
+        <condition property="unnamed.module.internal">
+            <not>
+                <isset property="named.module.internal"/>
+            </not>
+        </condition>
+        <property name="javac.modulepath" value=""/>
+        <property name="run.modulepath" value="${javac.modulepath}"/>
+        <property name="module.build.classes.dir" value="${build.classes.dir}"/>
+        <property name="debug.modulepath" value="${run.modulepath}"/>
+        <property name="javac.upgrademodulepath" value=""/>
+        <property name="run.upgrademodulepath" value="${javac.upgrademodulepath}"/>
+        <condition else="" property="javac.systemmodulepath.cmd.line.arg" value="--system '${javac.systemmodulepath}'">
+            <and>
+                <isset property="javac.systemmodulepath"/>
+                <length length="0" string="${javac.systemmodulepath}" when="greater"/>
+            </and>
+        </condition>
+        <property name="dist.jlink.dir" value="${dist.dir}/jlink"/>
+        <property name="dist.jlink.output" value="${dist.jlink.dir}/${application.title}"/>
+        <property name="module.name" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property,-init-modules-supported" name="-do-init">
+        <property name="platform.java" value="${java.home}/bin/java"/>
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="splashscreen.available">
+            <and>
+                <not>
+                    <equals arg1="${application.splash}" arg2="" trim="true"/>
+                </not>
+                <available file="${application.splash}"/>
+            </and>
+        </condition>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="profile.available">
+            <and>
+                <isset property="javac.profile"/>
+                <length length="0" string="${javac.profile}" when="greater"/>
+                <not>
+                    <matches pattern="1\.[0-7](\..*)?" string="${javac.source}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <or>
+                <not>
+                    <istrue value="${jar.archive.disabled}"/>
+                </not>
+                <istrue value="${not.archive.disabled}"/>
+            </or>
+        </condition>
+        <condition property="do.archive+manifest.available">
+            <and>
+                <isset property="manifest.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+main.class.available">
+            <and>
+                <isset property="main.class.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+splashscreen.available">
+            <and>
+                <isset property="splashscreen.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+profile.available">
+            <and>
+                <isset property="profile.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="run.jvmargs.ide" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <property name="manifest.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <and>
+                <isset property="endorsed.classpath"/>
+                <not>
+                    <equals arg1="${endorsed.classpath}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
+            <isset property="profile.available"/>
+        </condition>
+        <condition else="false" property="jdkBug6558476">
+            <and>
+                <matches pattern="1\.[56]" string="${java.specification.version}"/>
+                <not>
+                    <os family="unix"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="javac.fork">
+            <or>
+                <istrue value="${jdkBug6558476}"/>
+                <istrue value="${javac.external.vm}"/>
+            </or>
+        </condition>
+        <property name="jar.index" value="false"/>
+        <property name="jar.index.metainf" value="${jar.index}"/>
+        <property name="copylibs.rebase" value="true"/>
+        <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+        <condition property="junit.available">
+            <or>
+                <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
+                <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
+            </or>
+        </condition>
+        <condition property="testng.available">
+            <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
+        </condition>
+        <condition property="junit+testng.available">
+            <and>
+                <istrue value="${junit.available}"/>
+                <istrue value="${testng.available}"/>
+            </and>
+        </condition>
+        <condition else="testng" property="testng.mode" value="mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <condition else="" property="testng.debug.mode" value="-mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <property name="java.failonerror" value="true"/>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="modules.supported.internal" name="-init-macrodef-javac-with-module">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.modulepath}" name="modulepath"/>
+            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${javac.processormodulepath}" name="processormodulepath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath" unless:set="named.module.internal"/>
+            <attribute default="${src.dir}" if:set="named.module.internal" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <condition property="warn.excludes.internal">
+                    <and>
+                        <isset property="named.module.internal"/>
+                        <length length="0" string="@{excludes}" trim="true" when="greater"/>
+                    </and>
+                </condition>
+                <echo if:set="warn.excludes.internal" level="warning" message="The javac excludes are not supported in the JDK 9 Named Module."/>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <condition property="processormodulepath.set">
+                    <resourcecount count="0" when="greater">
+                        <path>
+                            <pathelement path="@{processormodulepath}"/>
+                        </path>
+                    </resourcecount>
+                </condition>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <modulepath>
+                        <path path="@{modulepath}"/>
+                    </modulepath>
+                    <upgrademodulepath>
+                        <path path="@{upgrademodulepath}"/>
+                    </upgrademodulepath>
+                    <compilerarg line="${javac.systemmodulepath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg if:set="processormodulepath.set" value="--processor-module-path"/>
+                    <compilerarg if:set="processormodulepath.set" path="@{processormodulepath}"/>
+                    <compilerarg unless:set="processormodulepath.set" value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}" unless:set="processormodulepath.set"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors" unless="modules.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.modulepath}" name="modulepath"/>
+            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-source-module-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.modulepath}" name="modulepath"/>
+            <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-module,-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete>
+                    <fileset file="${javac.includesfile.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-init">
+        <condition else="false" property="nb.junit.batch" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <not>
+                    <isset property="test.method"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="nb.junit.single" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <isset property="test.method"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-init-test-properties">
+        <property name="test.binaryincludes" value="&lt;nothing&gt;"/>
+        <property name="test.binarytestincludes" value=""/>
+        <property name="test.binaryexcludes" value=""/>
+    </target>
+    <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-junit-prototype-with-module">
+        <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <element name="customizePrototype" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <modulepath>
+                        <path path="${run.test.modulepath}"/>
+                    </modulepath>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${run.test.jvmargs}"/>
+                    <customizePrototype/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-modules-supported" name="-init-macrodef-junit-prototype-without-module" unless="modules.supported.internal">
+        <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <element name="customizePrototype" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-ea"/>
+                    <customizePrototype/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit-prototype>
+                    <customizePrototype>
+                        <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                        <customize/>
+                    </customizePrototype>
+                </j2seproject3:junit-prototype>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit-prototype>
+                    <customizePrototype>
+                        <batchtest todir="${build.test.results.dir}">
+                            <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                                <filename name="@{testincludes}"/>
+                            </fileset>
+                            <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                                <filename name="${test.binarytestincludes}"/>
+                            </fileset>
+                        </batchtest>
+                        <customize/>
+                    </customizePrototype>
+                </j2seproject3:junit-prototype>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
+    <target if="${testng.available}" name="-init-macrodef-testng">
+        <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
+                    <isset property="test.method"/>
+                </condition>
+                <union id="test.set">
+                    <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
+                        <filename name="@{testincludes}"/>
+                    </fileset>
+                </union>
+                <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
+                <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="Brennenstuhl" testname="TestNG tests" workingDir="${work.dir}">
+                    <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
+                    <propertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </propertyset>
+                    <classpath>
+                        <path path="${run.test.classpath}"/>
+                    </classpath>
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <customize/>
+                </testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-test-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <echo>No tests executed.</echo>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
+        <macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <sequential>
+                <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customize>
+                </j2seproject3:test-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+        <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customizeDebuggee" optional="true"/>
+            <sequential>
+                <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+                        <customizeDebuggee/>
+                    </customize>
+                </j2seproject3:junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${testng.available}" name="-init-macrodef-testng-debug">
+        <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element name="customize2" optional="true"/>
+            <sequential>
+                <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
+                    <isset property="test.method"/>
+                </condition>
+                <condition else="-suitename Brennenstuhl -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
+                    <matches pattern=".*\.xml" string="@{testClass}"/>
+                </condition>
+                <delete dir="${build.test.results.dir}" quiet="true"/>
+                <mkdir dir="${build.test.results.dir}"/>
+                <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
+                    <customizeDebuggee>
+                        <customize2/>
+                        <jvmarg value="-ea"/>
+                        <arg line="${testng.debug.mode}"/>
+                        <arg line="-d ${build.test.results.dir}"/>
+                        <arg line="-listener org.testng.reporters.VerboseReporter"/>
+                        <arg line="${testng.cmd.args}"/>
+                    </customizeDebuggee>
+                </j2seproject3:debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
+        <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element implicit="true" name="customize2" optional="true"/>
+            <sequential>
+                <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2/>
+                </j2seproject3:testng-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customizeDebuggee>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customizeDebuggee>
+                </j2seproject3:test-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2>
+                        <syspropertyset>
+                            <propertyref prefix="test-sys-prop."/>
+                            <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                        </syspropertyset>
+                    </customize2>
+                </j2seproject3:testng-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
+    <!--
+                pre NB7.2 profiling section; consider it deprecated
+            -->
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
+    <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
+        <macrodef name="resolve">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${env.@{value}}"/>
+            </sequential>
+        </macrodef>
+        <macrodef name="profile">
+            <attribute default="${main.class}" name="classname"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property environment="env"/>
+                <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+                <java classname="@{classname}" dir="${profiler.info.dir}" failonerror="${java.failonerror}" fork="true" jvm="${profiler.info.jvm}">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="${profiler.info.jvmargs.agent}"/>
+                    <jvmarg line="${profiler.info.jvmargs}"/>
+                    <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+                    <arg line="${application.args}"/>
+                    <classpath>
+                        <path path="${run.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
+        <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+        <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+    </target>
+    <!--
+                end of pre NB7.2 profiling section
+            -->
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.modulepath}" name="modulepath"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <modulepath>
+                        <path path="@{modulepath}"/>
+                    </modulepath>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${module.name}" name="modulename"/>
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.modulepath}" name="modulepath"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customizeDebuggee" optional="true"/>
+            <sequential>
+                <j2seproject1:java classname="@{classname}" classpath="@{classpath}" modulename="@{modulename}" modulepath="@{modulepath}">
+                    <customize>
+                        <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+                        <customizeDebuggee/>
+                    </customize>
+                </j2seproject1:java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-source-module-properties" if="named.module.internal" name="-init-macrodef-java-with-module">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${module.name}" name="modulename"/>
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.modulepath}" name="modulepath"/>
+            <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <attribute default="jvm" name="jvm"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" module="@{modulename}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <modulepath>
+                        <pathelement path="@{modulepath}"/>
+                        <pathelement location="${module.build.classes.dir}"/>
+                    </modulepath>
+                    <upgrademodulepath>
+                        <path path="@{upgrademodulepath}"/>
+                    </upgrademodulepath>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-source-module-properties" if="unnamed.module.internal" name="-init-macrodef-java-with-unnamed-module">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="" name="modulename"/>
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.modulepath}" name="modulepath"/>
+            <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <attribute default="jvm" name="jvm"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <modulepath>
+                        <path path="@{modulepath}"/>
+                    </modulepath>
+                    <upgrademodulepath>
+                        <path path="@{upgrademodulepath}"/>
+                    </upgrademodulepath>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-source-module-properties" name="-init-macrodef-java-without-module" unless="modules.supported.internal">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="" name="modulename"/>
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="" name="modulepath"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <attribute default="jvm" name="jvm"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-java-with-module, -init-macrodef-java-with-unnamed-module, -init-macrodef-java-without-module" name="-init-macrodef-java"/>
+    <target name="-init-macrodef-copylibs">
+        <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${manifest.file}" name="manifest"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+                <pathconvert property="run.classpath.without.build.classes.dir">
+                    <path path="${run.classpath}"/>
+                    <map from="${build.classes.dir.resolved}" to=""/>
+                </pathconvert>
+                <pathconvert pathsep=" " property="jar.classpath">
+                    <path path="${run.classpath.without.build.classes.dir}"/>
+                    <chainedmapper>
+                        <flattenmapper/>
+                        <filtermapper>
+                            <replacestring from=" " to="%20"/>
+                        </filtermapper>
+                        <globmapper from="*" to="lib/*"/>
+                    </chainedmapper>
+                </pathconvert>
+                <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+                <copylibs compress="${jar.compress}" excludeFromCopy="${copylibs.excludes}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" manifestencoding="UTF-8" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+                    <fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
+                    <manifest>
+                        <attribute name="Class-Path" value="${jar.classpath}"/>
+                        <customize/>
+                    </manifest>
+                </copylibs>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifestencoding="UTF-8">
+                <j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.processor.options" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: Brennenstuhl was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean">
+            <param name="no.dependencies" value="true"/>
+        </antcall>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy todir="${build.classes.dir}/META-INF">
+            <fileset dir="${meta.inf.dir}" includes="persistence.xml orm.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}, module-info.java" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile" name="-check-module-main-class">
+        <pathconvert property="main.class.file">
+            <string value="${main.class}"/>
+            <unpackagemapper from="*" to="*.class"/>
+        </pathconvert>
+        <condition property="do.module.main.class">
+            <and>
+                <isset property="main.class.available"/>
+                <available file="${build.classes.dir}/module-info.class"/>
+                <available file="${build.classes.dir}/${main.class.file}"/>
+                <isset property="libs.CopyLibs.classpath"/>
+                <available classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-check-module-main-class" if="do.module.main.class" name="-set-module-main-class">
+        <taskdef classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}" name="modulemainclass"/>
+        <modulemainclass failonerror="false" mainclass="${main.class}" moduleinfo="${build.classes.dir}/module-info.class"/>
+    </target>
+    <target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <touch file="${tmp.manifest.file}" verbose="false"/>
+    </target>
+    <target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <copy encoding="${manifest.encoding}" file="${manifest.file}" outputencoding="UTF-8" tofile="${tmp.manifest.file}"/>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass">
+        <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
+            <attribute name="Main-Class" value="${main.class}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile">
+        <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
+            <attribute name="Profile" value="${javac.profile}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-set-splashscreen">
+        <basename file="${application.splash}" property="splashscreen.basename"/>
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+        <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update">
+            <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+        </manifest>
+    </target>
+    <target depends="init,compile" name="-check-do-mkdist">
+        <condition property="do.mkdist">
+            <and>
+                <isset property="do.archive"/>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+                <not>
+                    <available file="${build.classes.dir}/module-info.class"/>
+                </not>
+            </and>
+        </condition>
+    </target>
+    <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-check-do-mkdist" if="do.mkdist" name="-do-jar-copylibs">
+        <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+        <echo level="info">To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-check-do-mkdist" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
+        <j2seproject1:jar manifest="${tmp.manifest.file}"/>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <condition else="${dist.jar.resolved}" property="jar.usage.message.class.path.replacement" value="">
+            <isset property="named.module.internal"/>
+        </condition>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${jar.usage.message.class.path.replacement}"/>
+        </pathconvert>
+        <pathconvert property="run.modulepath.with.dist.jar">
+            <path location="${dist.jar.resolved}"/>
+            <path path="${run.modulepath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <condition else="${run.modulepath}" property="jar.usage.message.run.modulepath.with.dist.jar" value="${run.modulepath.with.dist.jar}">
+            <isset property="named.module.internal"/>
+        </condition>
+        <condition else="" property="jar.usage.message.module.path" value=" -p ${jar.usage.message.run.modulepath.with.dist.jar}">
+            <and>
+                <isset property="modules.supported.internal"/>
+                <length length="0" string="${jar.usage.message.run.modulepath.with.dist.jar}" when="greater"/>
+            </and>
+        </condition>
+        <condition else="" property="jar.usage.message.class.path" value=" -cp ${run.classpath.with.dist.jar}">
+            <length length="0" string="${run.classpath.with.dist.jar}" when="greater"/>
+        </condition>
+        <condition else="/${main.class}" property="jar.usage.message.main.class.class.selector" value="">
+            <isset property="do.module.main.class"/>
+        </condition>
+        <condition else=" ${main.class}" property="jar.usage.message.main.class" value=" -m ${module.name}${jar.usage.message.main.class.class.selector}">
+            <isset property="named.module.internal"/>
+        </condition>
+        <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java}${jar.usage.message.module.path}${jar.usage.message.class.path}${jar.usage.message.main.class}">
+            <isset property="main.class.available"/>
+        </condition>
+        <condition else="debug" property="jar.usage.level" value="info">
+            <isset property="main.class.available"/>
+        </condition>
+        <echo level="${jar.usage.level}" message="${jar.usage.message}"/>
+    </target>
+    <target depends="-do-jar-copylibs" if="do.archive" name="-do-jar-delete-manifest">
+        <delete>
+            <fileset file="${tmp.manifest.file}"/>
+        </delete>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-jar,-do-jar-delete-manifest" name="-do-jar-without-libraries"/>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-copylibs,-do-jar-delete-manifest" name="-do-jar-with-libraries"/>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-set-module-main-class,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
+    <target depends="init,compile,-pre-jar,-do-jar,-post-jar,deploy" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                DEPLOY SECTION
+                =================
+            -->
+    <target name="-pre-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init" name="-check-jlink">
+        <condition property="do.jlink.internal">
+            <and>
+                <istrue value="${do.jlink}"/>
+                <isset property="do.archive"/>
+                <isset property="named.module.internal"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="init,-do-jar,-post-jar,-pre-deploy,-check-jlink" if="do.jlink.internal" name="-do-deploy">
+        <delete dir="${dist.jlink.dir}" failonerror="false" quiet="true"/>
+        <property name="jlink.launcher.name" value="${application.title}"/>
+        <condition else="${module.name}" property="jlink.add.modules" value="${module.name},${jlink.additionalmodules}">
+            <and>
+                <isset property="jlink.additionalmodules"/>
+                <length length="0" string="${jlink.additionalmodules}" when="greater"/>
+            </and>
+        </condition>
+        <condition property="jlink.do.strip.internal">
+            <and>
+                <isset property="jlink.strip"/>
+                <istrue value="${jlink.strip}"/>
+            </and>
+        </condition>
+        <condition property="jlink.do.additionalparam.internal">
+            <and>
+                <isset property="jlink.additionalparam"/>
+                <length length="0" string="${jlink.additionalparam}" when="greater"/>
+            </and>
+        </condition>
+        <condition property="jlink.do.launcher.internal">
+            <and>
+                <istrue value="${jlink.launcher}"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <property name="platform.jlink" value="${jdk.home}/bin/jlink"/>
+        <property name="jlink.systemmodules.internal" value="${jdk.home}/jmods"/>
+        <exec executable="${platform.jlink}">
+            <arg value="--module-path"/>
+            <arg path="${jlink.systemmodules.internal}:${run.modulepath}:${dist.jar}"/>
+            <arg value="--add-modules"/>
+            <arg value="${jlink.add.modules}"/>
+            <arg if:set="jlink.do.strip.internal" value="--strip-debug"/>
+            <arg if:set="jlink.do.launcher.internal" value="--launcher"/>
+            <arg if:set="jlink.do.launcher.internal" value="${jlink.launcher.name}=${module.name}/${main.class}"/>
+            <arg if:set="jlink.do.additionalparam.internal" line="${jlink.additionalparam}"/>
+            <arg value="--output"/>
+            <arg value="${dist.jlink.output}"/>
+        </exec>
+    </target>
+    <target name="-post-deploy">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-do-jar,-post-jar,-pre-deploy,-do-deploy,-post-deploy" name="deploy"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customizeDebuggee>
+                <arg line="${application.args}"/>
+            </customizeDebuggee>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                =================
+                PROFILING SECTION
+                =================
+            -->
+    <!--
+                pre NB7.2 profiler integration
+            -->
+    <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile/>
+    </target>
+    <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
+        <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="${profile.class}"/>
+    </target>
+    <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </profile>
+    </target>
+    <target depends="-init-macrodef-junit,profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <j2seproject3:junit excludes="${excludes}" includes="${includes}" testincludes="${profile.class}" testmethods="">
+            <customize>
+                <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+                <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+                <jvmarg value="${profiler.info.jvmargs.agent}"/>
+                <jvmarg line="${profiler.info.jvmargs}"/>
+                <classpath>
+                    <path path="${run.test.classpath}"/>
+                </classpath>
+            </customize>
+        </j2seproject3:junit>
+    </target>
+    <!--
+                end of pre NB72 profiling section
+            -->
+    <target if="netbeans.home" name="-profile-check">
+        <condition property="profiler.configured">
+            <or>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
+            </or>
+        </condition>
+    </target>
+    <target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
+        <startprofiler/>
+        <antcall target="run"/>
+    </target>
+    <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcall target="run-single"/>
+    </target>
+    <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
+    <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <startprofiler/>
+        <antcall target="test-single"/>
+    </target>
+    <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcall target="run-test-with-main"/>
+    </target>
+    <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <startprofiler/>
+        <antcall target="run-applet"/>
+    </target>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" if="have.sources" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}">
+            <and>
+                <isset property="endorsed.classpath.cmd.line.arg"/>
+                <not>
+                    <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <condition else="" property="bug5101868workaround" value="*.java">
+            <matches pattern="1\.[56](\..*)?" string="${java.version}"/>
+        </condition>
+        <condition else="" property="javadoc.html5.cmd.line.arg" value="-html5">
+            <and>
+                <isset property="javadoc.html5"/>
+                <available file="${jdk.home}${file.separator}lib${file.separator}jrt-fs.jar"/>
+            </and>
+        </condition>
+        <javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+                <exclude name="*.java"/>
+            </fileset>
+            <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
+            <arg line="${javadoc.html5.cmd.line.arg}"/>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                TEST COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-javac-module-properties-with-module">
+        <j2seproject3:modulename property="test.module.name" sourcepath="${test.src.dir}"/>
+        <condition else="${empty.dir}" property="javac.test.sourcepath" value="${test.src.dir}">
+            <and>
+                <isset property="test.module.name"/>
+                <length length="0" string="${test.module.name}" when="greater"/>
+            </and>
+        </condition>
+        <condition else="--patch-module ${module.name}=${test.src.dir} --add-reads ${module.name}=ALL-UNNAMED" property="javac.test.compilerargs" value="--add-reads ${test.module.name}=ALL-UNNAMED">
+            <and>
+                <isset property="test.module.name"/>
+                <length length="0" string="${test.module.name}" when="greater"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-run-module-properties">
+        <condition else="${module.name}" property="run.test.addexport.source.module.internal" value="${test.module.name}">
+            <and>
+                <isset property="test.module.name"/>
+                <length length="0" string="${test.module.name}" when="greater"/>
+            </and>
+        </condition>
+        <fileset dir="${build.test.classes.dir}" id="run.test.packages.internal" includes="**/*.class"/>
+        <property location="${build.test.classes.dir}" name="build.test.classes.dir.abs.internal"/>
+        <pathconvert pathsep=" " property="run.test.addexports.internal" refid="run.test.packages.internal">
+            <chainedmapper>
+                <regexpmapper from="^(.*)\Q${file.separator}\E.*\.class$$" to="\1"/>
+                <filtermapper>
+                    <uniqfilter/>
+                    <replacestring from="${build.test.classes.dir.abs.internal}" to=""/>
+                </filtermapper>
+                <cutdirsmapper dirs="1"/>
+                <packagemapper from="*" to="--add-exports ${run.test.addexport.source.module.internal}/*=ALL-UNNAMED"/>
+            </chainedmapper>
+        </pathconvert>
+        <condition else="--patch-module ${module.name}=${build.test.classes.dir} --add-modules ${module.name} --add-reads ${module.name}=ALL-UNNAMED ${run.test.addexports.internal}" property="run.test.jvmargs" value="--add-modules ${test.module.name} --add-reads ${test.module.name}=ALL-UNNAMED ${run.test.addexports.internal}">
+            <and>
+                <isset property="test.module.name"/>
+                <length length="0" string="${test.module.name}" when="greater"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-init-source-module-properties" name="-init-test-module-properties-without-module" unless="named.module.internal">
+        <property name="javac.test.sourcepath" value="${empty.dir}"/>
+        <property name="javac.test.compilerargs" value=""/>
+        <property name="run.test.jvmargs" value=""/>
+    </target>
+    <target depends="-init-test-javac-module-properties-with-module,-init-test-module-properties-without-module" name="-init-test-module-properties"/>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${javac.test.sourcepath}" srcdir="${test.src.dir}">
+            <customize>
+                <compilerarg line="${javac.test.compilerargs}"/>
+            </customize>
+        </j2seproject3:javac>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}, module-info.java" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}">
+            <customize>
+                <compilerarg line="${javac.test.compilerargs}"/>
+            </customize>
+        </j2seproject3:javac>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                TEST EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-init-test-run-module-properties,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
+        <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+    <!--
+                =======================
+                TEST DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customizeDebuggee>
+                <arg value="${applet.url}"/>
+            </customizeDebuggee>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: Brennenstuhl was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.jlink.output}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <and>
+                <not>
+                    <isset property="already.built.${call.subproject}"/>
+                </not>
+                <available file="${call.script}"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
diff --git a/Brennenstuhl/nbproject/genfiles.properties b/Brennenstuhl/nbproject/genfiles.properties
new file mode 100644
index 0000000..56d6dc4
--- /dev/null
+++ b/Brennenstuhl/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=2cdd87f6
+build.xml.script.CRC32=9d412d19
+build.xml.stylesheet.CRC32=f85dc8f2@1.93.0.48
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2cdd87f6
+nbproject/build-impl.xml.script.CRC32=08c29b05
+nbproject/build-impl.xml.stylesheet.CRC32=f89f7d21@1.93.0.48
diff --git a/Brennenstuhl/nbproject/project.properties b/Brennenstuhl/nbproject/project.properties
new file mode 100644
index 0000000..28a65bf
--- /dev/null
+++ b/Brennenstuhl/nbproject/project.properties
@@ -0,0 +1,113 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processor.options=
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+    ${run.classpath}
+debug.modulepath=\
+    ${run.modulepath}
+debug.test.classpath=\
+    ${run.test.classpath}
+debug.test.modulepath=\
+    ${run.test.modulepath}
+# Files in build.classes.dir which should be excluded from distribution jar
+dist.archive.excludes=
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/Brennenstuhl.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+dist.jlink.dir=${dist.dir}/jlink
+dist.jlink.output=${dist.jlink.dir}/Brennenstuhl
+excludes=
+file.reference.commons-io-2.6.jar=C:\\NetBeans\\TobisThesisWork\\lib\\commons-io-2.6.jar
+file.reference.dis-enums-1.3.jar=C:\\NetBeans\\TobisThesisWork\\lib\\dis-enums-1.3.jar
+file.reference.guava-28.0-jre.jar=C:\\NetBeans\\TobisThesisWork\\lib\\guava-28.0-jre.jar
+file.reference.Jama-1.0.3.jar=C:\\NetBeans\\TobisThesisWork\\lib\\Jama-1.0.3.jar
+file.reference.open-dis7-entities-all.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-entities-all.jar
+file.reference.open-dis7-java.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-java.jar
+file.reference.open-dis7-javadoc.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-javadoc.jar
+file.reference.open-dis7-source.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-source.jar
+file.reference.open-dis7.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7.jar
+file.reference.open-dis_4.16.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis_4.16.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${file.reference.Jama-1.0.3.jar}:\
+    ${file.reference.commons-io-2.6.jar}:\
+    ${file.reference.dis-enums-1.3.jar}:\
+    ${file.reference.guava-28.0-jre.jar}:\
+    ${file.reference.open-dis7-entities-all.jar}:\
+    ${file.reference.open-dis7-java.jar}:\
+    ${file.reference.open-dis7-javadoc.jar}:\
+    ${file.reference.open-dis7-source.jar}:\
+    ${file.reference.open-dis7.jar}:\
+    ${file.reference.open-dis_4.16.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.external.vm=true
+javac.modulepath=
+javac.processormodulepath=
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=14
+javac.target=14
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javac.test.modulepath=\
+    ${javac.modulepath}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.html5=false
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+# The jlink additional root modules to resolve
+jlink.additionalmodules=
+# The jlink additional command line parameters
+jlink.additionalparam=
+jlink.launcher=true
+jlink.launcher.name=Brennenstuhl
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=true
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project.
+# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
+# To set system properties for unit tests define test-sys-prop.name=value:
+run.jvmargs=
+run.modulepath=\
+    ${javac.modulepath}
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+run.test.modulepath=\
+    ${javac.test.modulepath}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
diff --git a/Brennenstuhl/nbproject/project.xml b/Brennenstuhl/nbproject/project.xml
new file mode 100644
index 0000000..e1bea72
--- /dev/null
+++ b/Brennenstuhl/nbproject/project.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>Brennenstuhl</name>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+    </configuration>
+</project>
diff --git a/Brennenstuhl/src/DISTools/Compressor.java b/Brennenstuhl/src/DISTools/Compressor.java
new file mode 100644
index 0000000..a76e263
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/Compressor.java
@@ -0,0 +1,174 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+import static java.lang.Math.pow;
+import static java.lang.Math.sqrt;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ *
+ * @author tobia
+ */
+public class Compressor {
+
+    private LinkedHashMap<Double, Coordinates> localMap;
+
+    public Compressor(LinkedHashMap<Double, Coordinates> localHashMap) {
+
+        //copy the given HashMap to a localMap
+        this.localMap = new LinkedHashMap<>();
+
+        Set<Double> keys = localHashMap.keySet();
+
+        for (Double k : keys) {
+
+            localMap.put(k, localHashMap.get(k));
+
+        }
+
+        System.out.println("DISTools.Regression.<init>()");
+
+    }
+
+    public TreeMap<Double, Coordinates> doCompression() {
+
+        System.out.println("DISTools.Regression.doRegression()");
+
+        //Check whether points could be deleted to compress the stream
+        //https://www.crashkurs-statistik.de/einfache-lineare-regression/
+        TreeMap<Double, Coordinates> streamMap = new TreeMap<>();
+
+        Set<Double> keys = localMap.keySet();
+
+        //Copy LinkedHashMap into TreeMap to be able to pull the first element.
+        streamMap.putAll(localMap);
+
+        TreeMap<Double, Coordinates> returnMap = new TreeMap<>();
+        //TreeMap of slidingWindows will store all of the points that are currently processed
+        //use .pullFirstEntry() to get rid of the points at the beginning.
+        TreeMap<Double, Coordinates> slidingWindow = new TreeMap<>();
+
+        boolean addToWindow = true;
+
+        while (streamMap.size() > 0) {
+            slidingWindow.put(streamMap.firstEntry().getKey(), streamMap.get(streamMap.firstEntry().getKey()));
+            streamMap.pollFirstEntry();
+
+            //Calculate the mean and SD
+            Set<Double> slidingWindowKeys = slidingWindow.keySet();
+
+            if (slidingWindow.size() >= 3) {
+
+                List<Double> tList = new ArrayList<>();
+                List<Double> xList = new ArrayList<>();
+                List<Double> yList = new ArrayList<>();
+                List<Double> zList = new ArrayList<>();
+                
+
+
+
+                Double[] k = new Double[slidingWindowKeys.size()];
+                slidingWindowKeys.toArray(k);
+
+                for (int i = 0; i < slidingWindow.size(); i++) {
+
+                    //Fix Loop to fill Arrays
+                    tList.add(i, k[i]);
+
+                    xList.add(i, slidingWindow.get(k[i]).getX());
+
+                    yList.add(i, slidingWindow.get(k[i]).getY());
+
+                    zList.add(i, slidingWindow.get(k[i]).getZ());
+
+                }
+
+
+
+                //calculate triangle according to the homepage
+                for (int i = 0; i < slidingWindow.size(); i++) {
+
+
+                    //Calculate Area of Triangle
+                    //http://www.ambrsoft.com/TrigoCalc/Line3D/LineColinear.htm
+                    double a = sqrt(pow(xList.get(1) - xList.get(0), 2) + pow(yList.get(1) - yList.get(0), 2) + pow(zList.get(1) - zList.get(0), 2));
+                    double b = sqrt(pow(xList.get(i) - xList.get(0), 2) + pow(yList.get(i) - yList.get(0), 2) + pow(zList.get(i) - zList.get(0), 2));
+                    double c = sqrt(pow(xList.get(i) - xList.get(1), 2) + pow(yList.get(i) - yList.get(1), 2) + pow(zList.get(i) - zList.get(1), 2));
+
+                    double s = (a + b + c) / 2;
+
+                    double areaA = sqrt(s * (s - a) * (s - b) * (s - c));
+
+                    if ((areaA >= 0.1) || (tList.get(i) - tList.get(0) >= 4.0)) {
+
+                        System.out.println("Threshold met. Break");
+
+                        //grab the first and the last point from the regression test and push it to the returnMap
+                        Coordinates firstPoint = new Coordinates();
+                        firstPoint.setX(xList.get(0));
+                        firstPoint.setY(yList.get(0));
+                        firstPoint.setZ(zList.get(0));
+
+                        Coordinates lastPoint = new Coordinates(xList.get(i), yList.get(i), zList.get(i));
+
+                        returnMap.put(tList.get(0), firstPoint);
+                        returnMap.put(tList.get(i), lastPoint);
+
+                        slidingWindow.clear();
+
+                        tList.clear();
+                        xList.clear();
+                        yList.clear();
+                        zList.clear();
+
+                        break;
+                    }
+
+                    if ((areaA <= 0.1) && (tList.get(i) - tList.get(0) <= 4.0) && streamMap.size() == 0) {
+
+                        System.out.println("StreamMap empty. All points left will be added. Break");
+
+                        //grab the first and the last point from the regression test and push it to the returnMap
+                        for (int j = 0; j < slidingWindow.size(); j++) {
+
+                            Coordinates leftPoints = new Coordinates(xList.get(j), yList.get(j), zList.get(j));
+
+                            returnMap.put(tList.get(j), leftPoints);
+
+                        }
+                        
+                        
+
+                        break;
+                    }
+
+
+                    System.out.println("Area of Triangle: " + areaA);
+
+                }
+
+
+            }
+
+        };
+
+        return returnMap;
+
+    }
+
+    ;
+    
+    private void calcValues() {
+
+    }
+;
+
+}
diff --git a/Brennenstuhl/src/DISTools/Coordinates.java b/Brennenstuhl/src/DISTools/Coordinates.java
new file mode 100644
index 0000000..2f2c85b
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/Coordinates.java
@@ -0,0 +1,58 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+/**
+ *
+ * @author tobia
+ */
+public class Coordinates {
+    
+    private double x;
+    private double y;
+    private double z;
+
+    public Coordinates(double x, double y, double z) {
+        this.setX(x);
+        this.setY(y);
+        this.setZ(z);
+    }
+    
+    public Coordinates() {
+        this.setX(0.0);
+        this.setY(0.0);
+        this.setZ(0.0);
+    }
+    
+    
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+
+    public double getZ() {
+        return z;
+    }
+
+    public void setZ(double z) {
+        this.z = z;
+    }
+    
+    
+    
+}
diff --git a/Brennenstuhl/src/DISTools/EspduReceiver.java b/Brennenstuhl/src/DISTools/EspduReceiver.java
new file mode 100644
index 0000000..7e1ff22
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/EspduReceiver.java
@@ -0,0 +1,111 @@
+package DISTools; 
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import edu.nps.moves.dis7.*;
+import edu.nps.moves.dis7.util.*;
+
+/**
+ * Receives PDUs from the network in IEEE DIS format.
+ * Adapted from OpenDIS library example package edu.nps.moves.examples
+ *
+ * @author DMcG
+ * @version $Id:$
+ */
+public class EspduReceiver
+{
+    /** Max size of a PDU in binary format that we can receive. This is actually
+     * somewhat outdated--PDUs can be larger--but this is a reasonable starting point.
+     */
+    public static final int MAX_PDU_SIZE = 8192;
+
+    /** Default multicast group address we send on. */
+    public String DEFAULT_MULTICAST_ADDRESS;
+	
+    /** Default multicast port used, matches Wireshark DIS capture default */
+    public int    DEFAULT_MULTICAST_PORT;
+
+    public String receive(String localBroadCastAddress, int localPort)
+	{
+		System.out.println("DisExamplesOpenDis7.EspduReceiver started...");
+	
+       String returnString;
+       returnString = new String("Test Return Receiver \n");
+       
+       this.DEFAULT_MULTICAST_ADDRESS = localBroadCastAddress;
+       this.DEFAULT_MULTICAST_PORT = localPort;
+                
+                
+        MulticastSocket socket;
+        DatagramPacket packet;
+        InetAddress address;
+        PduFactory pduFactory = new PduFactory();
+
+        try {
+            // Specify the socket to receive data
+            socket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
+//          socket.setBroadcast(true);
+       
+            address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
+            socket.joinGroup(address);
+
+          
+                byte buffer[] = new byte[MAX_PDU_SIZE];
+                packet = new DatagramPacket(buffer, buffer.length);
+
+                socket.receive(packet);
+
+                List<Pdu> pduBundle = pduFactory.getPdusFromBundle(packet.getData(),packet.getLength());
+                if (pduBundle.size() > 1)
+                    System.out.println("Bundle size is " + pduBundle.size());
+                returnString += "Bundle size is "+ pduBundle.size();
+                Iterator iterator = pduBundle.iterator();
+
+                while (iterator.hasNext())
+                {
+                    Pdu aPdu = (Pdu)iterator.next();
+                    String receiptMessage = "received PDU type " + aPdu.getPduType().getValue() + "=" + aPdu.getPduType().name() + " " + aPdu.getClass().getName();
+                    if (aPdu instanceof EntityStatePdu)
+                    {
+                        System.out.println("===============");
+                        returnString += "===============\n";
+                        System.out.println(receiptMessage);
+                        returnString += receiptMessage + "\n";
+                        EntityID      entityID = ((EntityStatePdu)aPdu).getEntityID();
+                        Vector3Double position = ((EntityStatePdu)aPdu).getEntityLocation();
+                        System.out.println("  entityID triplet: [" + entityID.getSiteID()+ ", " + entityID.getApplicationID()+ ", " + entityID.getEntityID()+ "] ");
+                        returnString += "  entityID triplet: [" + entityID.getSiteID()+ ", " + entityID.getApplicationID()+ ", " + entityID.getEntityID()+ "] ";
+                        System.out.println("  Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n");
+                        returnString += "  Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n";
+                    }
+                    else if (aPdu instanceof FirePdu)
+                    {    
+                        System.out.println(receiptMessage);
+                        returnString += receiptMessage + "\n";
+                        Vector3Double position = ((FirePdu)aPdu).getLocationInWorldCoordinates();
+                        System.out.println("  FirePdu locationInWorldCoordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
+                        returnString += "  FirePdu locationInWorldCoordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n";
+                    }
+                    else
+                    {    
+                        System.out.println(receiptMessage);
+                        returnString += receiptMessage + "\n";                        
+                    }
+                } // end iterator loop through PDU bundle
+            
+        } // end try block
+        catch (IOException e)
+		{
+            System.out.println("Problem with DisExamplesOpenDis7.EspduReceiver, see exception trace:");
+            returnString += "Problem with DisExamplesOpenDis7.EspduReceiver, see exception trace:\n";
+            System.out.println(e);
+            returnString += e + "\n";
+        }
+		System.out.println("DisExamplesOpenDis7.EspduReceiver complete.");
+                
+                return returnString;
+                
+    } // end main
+} // end class
diff --git a/Brennenstuhl/src/DISTools/EspduSender.java b/Brennenstuhl/src/DISTools/EspduSender.java
new file mode 100644
index 0000000..68704c9
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/EspduSender.java
@@ -0,0 +1,361 @@
+package DISTools;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import edu.nps.moves.dis7.*;
+import edu.nps.moves.dis7.util.*;
+
+/**
+ * Creates and sends ESPDUs in IEEE binary format. Adapted from OpenDIS library
+ * example package edu.nps.moves.examples
+ *
+ * @author Don McGregor
+ * @author Don Brutzman
+ */
+public class EspduSender
+{
+	public static final int NUMBER_TO_SEND = 1; // 5000
+
+	/**
+	 * Default multicast group address we send on.
+	 */
+	public String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3";
+
+	/**
+	 * Default multicast port used, matches Wireshark DIS capture default
+	 */
+	public int DEFAULT_MULTICAST_PORT = 3000;
+
+	public enum NetworkMode {
+		UNICAST, MULTICAST, BROADCAST
+	};
+
+	/**
+	 * Possible system properties, passed in via -Dattr=val networkMode:
+	 * unicast, broadcast, multicast destinationIp: where to send the packet.If
+ in multicast mode, this can be multicast.To determine broadcast
+ destination IP, use an online broadcast address calculator, for example
+ http://www.remotemonitoringsystems.ca/broadcast.php If in multicast mode,
+ a join() will be done on the multicast address.port: port used for both
+ source and destination.
+	 *
+	 * 
+     * @param localBroadCastAddress
+     * @param localPort
+     * @return 
+	 */
+	public String send(String localBroadCastAddress, int localPort)
+	{
+                String returnString;
+                returnString = new String();
+                this.DEFAULT_MULTICAST_ADDRESS = localBroadCastAddress;
+                this.DEFAULT_MULTICAST_PORT = localPort;
+                
+                
+		System.out.println("DisExamplesOpenDis7.EspduSender started...");
+
+		// Default settings. These are used if no system properties are set. 
+		// If system properties are passed in, these are overridden later.
+		NetworkMode networkMode = NetworkMode.BROADCAST;
+		InetAddress     address = null; // must be initialized, even if null
+		int                port = DEFAULT_MULTICAST_PORT;
+        MulticastSocket  socket = null; // must be initialized to avoid later error, even if null;
+		EntityStatePdu    espdu = new EntityStatePdu();
+        DisTime         disTime = new DisTime();
+
+		// ICBM coordinates for my office
+		double latitude = 36.595517;
+		double longitude = -121.877000;
+		try
+        {
+			address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
+		}
+        catch (UnknownHostException e)
+        {
+			System.out.println(e + " Cannot create multicast address");
+			System.exit(0);
+		}
+
+		// All system properties, passed in on the command line via -Dattribute=value
+		Properties systemProperties = System.getProperties();
+
+		// IP address we send to
+		String destinationIpString = systemProperties.getProperty("destinationIp");
+
+		// Port we send to, and local port we open the socket on
+		String portString = systemProperties.getProperty("port");
+
+		// Network mode: unicast, multicast, broadcast
+		String networkModeString = systemProperties.getProperty("networkMode"); // unicast or multicast or broadcast
+
+		// Set up socket to send information
+		try
+        {
+			if (portString != null) // Update port we send to, if provided
+			{
+				port = Integer.parseInt(portString);
+			}
+			socket = new MulticastSocket(port);
+
+			// Where we send packets to, the destination IP address
+			if (destinationIpString != null) 
+			{
+				address = InetAddress.getByName(destinationIpString);
+			}
+
+			// Type of transport: unicast, broadcast, or multicast
+			if (networkModeString != null)
+            {
+				if (networkModeString.equalsIgnoreCase("unicast")) 
+				{
+					networkMode = NetworkMode.UNICAST;
+				} 
+				else if (networkModeString.equalsIgnoreCase("broadcast"))
+                {
+					networkMode = NetworkMode.BROADCAST;
+				} 
+				else if (networkModeString.equalsIgnoreCase("multicast"))
+                {
+					networkMode = NetworkMode.MULTICAST;
+					if (!address.isMulticastAddress())
+					{
+						throw new RuntimeException("*** Error: sending to multicast address, but destination address " + address.toString() + "is not multicast");
+					}
+					socket.joinGroup(address);
+				}
+			} // end networkModeString
+		}
+		catch (IOException | RuntimeException e)
+		{
+			System.out.println("Unable to initialize network correctly, exiting.");
+			System.out.println(e);
+			System.exit(-1); // outta here
+		}
+
+		// Initialize values in the Entity State PDU object. The exercise ID is 
+		// a way to differentiate between different virtual worlds on one network.
+		// Note that some values (such as the PDU type and PDU family) are set
+		// automatically when you create the ESPDU.
+		espdu.setExerciseID((byte)1); //(short) 1);
+
+		// The EID is the unique identifier for objects in the world. This 
+		// EID should match up with the ID for the object specified in the 
+		// VMRL/x3d/virtual world.
+    
+  		EntityID entityID = espdu.getEntityID(); // initialize, reset, override
+        // TODO check: 0 is apparently not a valid site number, per DIS specification
+		entityID.setSiteID       ((short)1); // TODO utility method to allow int values
+		entityID.setApplicationID((short)2);
+		entityID.setEntityID     ((short)3);
+                espdu.setEntityID(entityID);
+
+		// Set the entity type. SISO has a big list of enumerations, so that by
+		// specifying various numbers we can say this is an M1A2 American tank,
+		// the USS Enterprise, and so on. We'll make this a tank. There is a 
+		// separate project elsehwhere in this project that implements DIS 
+		// enumerations in C++ and Java, but to keep things simple we just use
+		// numbers here.
+    
+        // New way using entity jar(s)
+        espdu.setEntityType(new edu.nps.moves.dis7.entities.usa.platform.land.M1A2());
+    
+    // Manual way:
+    /*
+		EntityType entityType = espdu.getEntityType();
+		entityType.setEntityKind(EntityKind.PLATFORM); //(short) 1);      // Platform (vs lifeform, munition, sensor, etc.)
+		entityType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA); //225);               // USA
+		entityType.setDomain(Domain.inst(PlatformDomain.LAND));          // Land (vs air, surface, subsurface, space)
+		entityType.setCategory((byte) 1);        // Tank
+		entityType.setSubCategory((byte) 1);     // M1 Abrams
+		entityType.setSpecific((byte) 3);        // M1A2 Abrams
+    */
+		Set<InetAddress> broadcastAddresses;
+
+		try // Loop through sending N ESPDUs
+		{
+			System.out.println("Sending " + NUMBER_TO_SEND + " sets of packets:"); // + address.toString()
+			
+			for (int index = 0; index < NUMBER_TO_SEND; index++) {
+				// DIS time is a pain in the uh, neck. DIS time units are 2^31-1 units per
+				// hour, and time is set to DIS time units from the top of the hour. 
+				// This means that if you start sending just before the top of the hour
+				// the time units can roll over to zero as you are sending. The receivers
+				// (escpecially homegrown ones) are often not able to detect rollover
+				// and may start discarding packets as dupes or out of order. We use
+				// an NPS timestamp here, hundredths of a second since the start of the
+				// year. The DIS standard for time is often ignored in the wild; I've seen
+				// people use Unix time (seconds since 1970) and more. Or you can
+				// just stuff idx into the timestamp field to get something that is monotonically
+				// increasing.
+
+				// Note that timestamp is used to detect duplicate and out of order packets. 
+				// That means if you DON'T change the timestamp, many implementations will simply
+				// discard subsequent packets that have an identical timestamp. Also, if they
+				// receive a PDU with an timestamp lower than the last one they received, they
+				// may discard it as an earlier, out-of-order PDU. So it is a good idea to
+				// update the timestamp on ALL packets sent.
+				// An alterative approach: actually follow the standard. It's a crazy concept,
+				// but it might just work.
+				int timestamp = disTime.getDisAbsoluteTimestamp();
+				espdu.setTimestamp(timestamp);
+
+				// Set the position of the entity in the world. DIS uses a cartesian 
+				// coordinate system with the origin at the center of the earth, the x
+				// axis out at the equator and prime meridian, y out at the equator and
+				// 90 deg east, and z up and out the north pole. To place an object on
+				// the earth's surface you also need a model for the shape of the earth
+				// (it's not a sphere.) All the fancy math necessary to do this is in
+				// the SEDRIS SRM package. There are also some one-off formulas for 
+				// doing conversions from, for example, lat/lon/altitude to DIS coordinates.
+				// Here we use those one-off formulas.
+				// Modify the position of the object. This will send the object a little
+				// due east by adding some to the longitude every iteration. Since we
+				// are on the Pacific coast, this sends the object east. Assume we are
+				// at zero altitude. In other worlds you'd use DTED to determine the
+				// local ground altitude at that lat/lon, or you'd just use ground clamping.
+				// The x and y values will change, but the z value should not.
+				//lon = lon + (double)((double)idx / 100000.0);
+				//System.out.println("lla=" + lat + "," + lon + ", 0.0");
+				double direction = Math.pow((double) (-1.0), (double) (index));
+				longitude = longitude + (direction * 0.00006);
+
+				double disCoordinates[] = CoordinateConversions.getXYZfromLatLonDegrees(latitude, longitude, 1.0);
+				Vector3Double location = espdu.getEntityLocation();
+				location.setX(disCoordinates[0]);
+				location.setY(disCoordinates[1]);
+				location.setZ(disCoordinates[2]);
+				System.out.println("===============");
+                                returnString += "===============\n";
+				System.out.println("Create new PDUs");
+                                returnString += "Create new PDU\n";
+				System.out.println("  latitude, longitude:   [" + latitude + ", " + longitude + "]");
+				returnString += "  latitude, longitude:   [" + latitude + ", " + longitude + "]\n";
+                                System.out.println("  coordinate conversion: [" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + "]");
+                                returnString += "  coordinate conversion: [" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + "]\n";
+				location = espdu.getEntityLocation();
+
+				System.out.println("Espdu #" + index + " entityID=[" + entityID.getSiteID()+ "," + entityID.getApplicationID()+ "," + entityID.getEntityID()+ "]");
+				returnString += "Espdu #" + index + " entityID=[" + entityID.getSiteID()+ "," + entityID.getApplicationID()+ "," + entityID.getEntityID()+ "]\n";
+                                double c[]   = {location.getX(), location.getY(), location.getZ()};
+				double lla[] = CoordinateConversions.xyzToLatLonDegrees(c);
+//              System.out.println("  DIS entityLocation: [" + location.getX() + "," + location.getY() + "," + location.getZ() + "]");
+				String debugString = " Location (latitude/longitude/altitude): [" + lla[0] + ", " + lla[1] + ", " + lla[2] + "]";
+//      		System.out.println(debugString);
+
+				// Optionally, we can do some rotation of the entity
+				/*
+            Orientation orientation = espdu.getEntityOrientation();
+            float psi = orientation.getPsi();
+            psi = psi + idx;
+            orientation.setPsi(psi);
+            orientation.setTheta((float)(orientation.getTheta() + idx /2.0));
+				 */
+				// You can set other ESPDU values here, such as the velocity, acceleration,
+				// and so on.
+				// Marshal out the espdu object to a byte array, then send a datagram
+				// packet with that data in it.
+				ByteArrayOutputStream baos = new ByteArrayOutputStream();
+				DataOutputStream dos = new DataOutputStream(baos);
+                DatagramPacket packet;
+
+				// The byte array here is the packet in DIS format. We put that into a 
+				// datagram and send it.
+				espdu.marshal(dos);
+				byte[] espduArray = baos.toByteArray();
+
+				FirePdu firePdu = new FirePdu();
+                firePdu.setLocationInWorldCoordinates(espdu.getEntityLocation());
+				byte[] fireArray = firePdu.marshal();
+
+				broadcastAddresses = getBroadcastAddresses();
+				Iterator iterator = broadcastAddresses.iterator();
+				while (iterator.hasNext())
+				{
+					InetAddress broadcast = (InetAddress) iterator.next();
+                    if (espduArray.length > 0)
+                    {
+                        System.out.println("Sending espdu datagram packet to " + broadcast);
+                        returnString += "Sending espdu datagram packet to " + broadcast + "\n";
+                        packet = new DatagramPacket(espduArray, espduArray.length, broadcast, port);
+                        socket.send(packet);
+                    }
+					// TODO experiment with these!  8)
+                    if (fireArray.length > 0)
+                    {
+                        System.out.println("Sending  fire datagram packet to " + broadcast);
+                        returnString += "Sending fire datagram packet to " + broadcast + "\n";
+                        packet = new DatagramPacket(fireArray, fireArray.length, broadcast, port); // alternate
+                        socket.send(packet);
+                    }
+				}
+
+				// Send every 1 second within loop. Otherwise all this will be all over in a fraction of a second.
+				Thread.sleep(1000); // msec
+			}
+		}
+		catch (Exception e)
+		{
+            System.out.println("Problem with DisExamplesOpenDis7.EspduSender, see exception trace:");
+			System.out.println(e);
+		}
+        System.out.println("===============");
+		System.out.println("DisExamplesOpenDis7.EspduSender complete.");
+                
+             return returnString;
+	}
+
+	/**
+	 * A number of sites get all snippy about using 255.255.255.255 for a
+	 * broadcast address; it trips their security software and they kick you off
+	 * their network. (Comcast, NPS, etc.) This determines the broadcast address for
+	 * all connected interfaces, based on the IP and subnet mask. If you have a
+	 * dual-homed host it will return a broadcast address for both. If you have
+	 * some VMs running on your host this will pick up the addresses for those
+	 * as well--e.g. running VMWare on your laptop with a local IP this will also
+	 * pick up a 192.168 address assigned to the VM by the host OS.
+	 *
+	 * @return set of all broadcast addresses
+	 */
+	public static Set<InetAddress> getBroadcastAddresses()
+	{
+		Set<InetAddress> broadcastAddresses = new HashSet<>();
+		Enumeration interfaces;
+
+		try {
+			interfaces = NetworkInterface.getNetworkInterfaces();
+
+			while (interfaces.hasMoreElements())
+			{
+				NetworkInterface anInterface = (NetworkInterface) interfaces.nextElement();
+
+				if (anInterface.isUp())
+				{
+					Iterator iterator = anInterface.getInterfaceAddresses().iterator();
+					while (iterator.hasNext())
+					{
+						InterfaceAddress anAddress = (InterfaceAddress) iterator.next();
+						if ((anAddress == null || anAddress.getAddress().isLinkLocalAddress()))
+						{
+							continue;
+						}
+
+						//System.out.println("Getting broadcast address for " + anAddress);
+						InetAddress broadcastAddress = anAddress.getBroadcast();
+						if (broadcastAddress != null)
+						{
+							broadcastAddresses.add(broadcastAddress);
+						}
+					}
+				}
+			}
+		}
+		catch (SocketException e) 
+		{
+            System.out.println("Problem with DisExamplesOpenDis7.EspduSender.getBroadcastAddresses(), see exception trace:");
+			System.out.println(e);
+		}
+		return broadcastAddresses;
+	}
+}
diff --git a/Brennenstuhl/src/DISTools/PduListenerSaver.java b/Brennenstuhl/src/DISTools/PduListenerSaver.java
new file mode 100644
index 0000000..7e5a6be
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/PduListenerSaver.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved.
+ * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html
+ */
+package DISTools;
+
+import java.io.IOException;
+import java.util.Scanner;
+
+/**
+ * PduSaver.java created on Aug 21, 2019
+ * MOVES Institute Naval Postgraduate School, Monterey, CA, USA www.nps.edu
+ *
+ * @author Mike Bailey, jmbailey@nps.edu
+ * @version $Id$
+ */
+public class PduListenerSaver
+{
+  private final static String DEFAULT_OUTPUTDIR = "pduLog";
+  private final static String MCAST_ADDR = "239.1.2.3";
+  private final static int DIS_PORT = 3000;
+
+  private enum mystate
+  {
+    RUNNING,
+    PAUSED;
+  }
+
+  public static void main(String[] args)
+  {
+    String outDir = DEFAULT_OUTPUTDIR;
+    String mcast = MCAST_ADDR;
+    int port = DIS_PORT;
+    
+    System.out.println("DisExamplesOpenDis7.PduListenerSaver started...");
+
+    switch (args.length) {
+      case 0:
+        break;
+      case 1:
+        outDir = args[0];
+        break;
+      case 3:
+        outDir = args[0];
+        mcast = args[1];
+        port = Integer.parseInt(args[2]);
+        break;
+      default:
+        System.err.println("Usage: PduListener() or PduListener(\"outputdir\") or PduListener(\"outputdir\",\"multicast address\", ipPort");
+        System.exit(1);
+    }
+
+    System.out.println("Beginning pdu save to directory " + outDir);
+    try {
+        
+      //RecorderTobi stores an unencoded PduLog
+      RecorderTobi recorder = new RecorderTobi(outDir, mcast, port);
+      //Recorder stores a BASE64 encoded PduLod
+      //Recorder recorder = new Recorder(outDir, mcast, port);
+      
+      recorder.startResume();
+      mystate state = mystate.RUNNING;
+      System.out.println("* recorder.startResume(), state=RUNNING, recording in progress...");
+      Scanner scan = new Scanner(System.in);
+
+      while (true) {
+        System.out.println("Warning: you must quit when complete, otherwise recorded PDUs are lost!");
+        System.out.println("Type p/enter to pause, r/enter to resume, q/enter to stop recording, save and quit");
+        String line = scan.nextLine();
+        if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) {
+          recorder.stopPause();
+          state = mystate.PAUSED;
+          System.out.println("* recorder.stopPause(), state=PAUSED, recording paused...");
+        }
+        else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) {
+          recorder.startResume();
+          state = mystate.RUNNING;
+          System.out.println("* recorder.startResume(), state=RUNNING, recording in progress...");
+        }
+        else if (line.equalsIgnoreCase("q")) {
+          recorder.end();
+          System.out.println("* recorder.end(), recording complete.");
+          break;
+        }
+      }
+      System.out.println("Ending pdu save to "+recorder.getLogFile());
+    }
+    catch (IOException ex) {
+      System.err.println("*** Exception: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage());
+    }
+  }
+}
diff --git a/Brennenstuhl/src/DISTools/PduReaderPlayer.java b/Brennenstuhl/src/DISTools/PduReaderPlayer.java
new file mode 100644
index 0000000..1ebd172
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/PduReaderPlayer.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved.
+ * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html
+ */
+package DISTools;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Scanner;
+
+/**
+ * PduSaver.java created on Aug 21, 2019 MOVES Institute Naval Postgraduate
+ * School, Monterey, CA, USA www.nps.edu
+ *
+ * @author Mike Bailey, jmbailey@nps.edu
+ * @version $Id$
+ */
+public class PduReaderPlayer {
+
+    private final static String DEFAULT_OUTPUTDIR = "pduLog";
+    private final static String MCAST_ADDR = "239.1.2.3";
+    private final static int DIS_PORT = 3000;
+
+    private enum mystate {
+        RUNNING,
+        PAUSED;
+    }
+
+    public static void main(String[] args) {
+        String outDir = DEFAULT_OUTPUTDIR;
+        String mcast = MCAST_ADDR;
+        int port = DIS_PORT;
+
+        System.out.println("DisExamplesOpenDis7.PduReaderPlayer started...");
+
+        switch (args.length) {
+            case 0:
+                break;
+            case 1:
+                outDir = args[0];
+                break;
+            case 3:
+                outDir = args[0];
+                mcast = args[1];
+                port = Integer.parseInt(args[2]);
+                break;
+            default:
+                System.err.println("Usage: PduReaderPlayer() or PduReaderPlayer(\"outputdir\") or PduReaderPlayer(\"outputdir\",\"multicast address\", ipPort");
+                System.exit(1);
+        }
+
+        System.out.println("Beginning pdu playback from directory " + outDir);
+        try {
+            //Use Tobis Code without decryption
+            //Does only work with unecrypted PduLogs
+            PlayerTobi player = new PlayerTobi(mcast, port, new File(outDir).toPath());
+
+            //Use Mikes Code
+            //Player player = new Player(mcast, port, new File(outDir).toPath());
+            player.startResume();
+            mystate state = mystate.RUNNING;
+            Scanner scan = new Scanner(System.in);
+
+            while (true) {
+                System.out.println("Type p/enter to pause, r/enter to resume, q/enter to quit");
+                String line = scan.nextLine();
+                if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) {
+                    player.stopPause();
+                    state = mystate.PAUSED;
+                } else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) {
+                    player.startResume();
+                    state = mystate.RUNNING;
+                } else if (line.equalsIgnoreCase("q")) {
+                    player.end();
+                    break;
+                }
+            }
+            System.out.println("Ending pdu files playback for directory " + outDir);
+            System.out.println("DisExamplesOpenDis7.PduReaderPlayer complete.");
+            System.exit(0); // not sure why this is necessary with Netbeans...
+        } catch (IOException ex) {
+            System.err.println("Exception: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage());
+        }
+    }
+}
diff --git a/Brennenstuhl/src/DISTools/PduReceiver.java b/Brennenstuhl/src/DISTools/PduReceiver.java
new file mode 100644
index 0000000..01a3a50
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/PduReceiver.java
@@ -0,0 +1,12 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+
+public interface PduReceiver
+{
+  void receivePdu(byte[] buff, int len);
+}
diff --git a/Brennenstuhl/src/DISTools/Player.java b/Brennenstuhl/src/DISTools/Player.java
new file mode 100644
index 0000000..057dc7c
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/Player.java
@@ -0,0 +1,242 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+/**
+ * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved.
+ * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html
+ */
+
+import com.google.common.primitives.Longs;
+
+import java.io.*;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Base64;
+
+import static DISTools.Recorder.*;
+
+public class Player
+{
+  private Path disLogDirectory;
+  private String ip;
+  private int port;
+  private Thread thrd;
+  
+  public Player(String ip, int port, Path disLogDirectory) throws IOException
+  {
+    this.disLogDirectory = disLogDirectory;
+    this.ip = ip;
+    this.port = port;
+    
+    thrd = new Thread(() -> begin());
+    thrd.setPriority(Thread.NORM_PRIORITY);
+    thrd.setName("PlayerThread");
+    thrd.setDaemon(true);
+    thrd.start();
+  }
+  
+  private Integer scenarioPduCount = null;
+  private boolean showPduCountsOneTime = false;
+  private int pduCount = 0;
+  private DatagramSocket dsock;
+  private BufferedReader brdr;
+  private Long startNanoTime = null;
+  private boolean paused = false;
+  
+  @SuppressWarnings("StatementWithEmptyBody")
+  public void begin()
+  {
+    try {
+      System.out.println("Replaying DIS logs.");
+      InetAddress addr = InetAddress.getByName(ip);
+      
+      FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith(".");
+      
+      File[] fs = disLogDirectory.toFile().listFiles(filter);
+      if (fs == null)
+        fs = new File[0];
+      
+      Arrays.sort(fs, (f1, f2) -> {
+        return f1.getName().compareTo(f2.getName());
+      });
+      //Arrays.sort(fs, Comparator.comparing(File::getName));
+
+      dsock = new DatagramSocket();
+      Base64.Decoder decdr = Base64.getDecoder();
+      
+      for (File f : fs) {
+        System.out.println("Replaying " + f.getAbsolutePath());
+        brdr = new BufferedReader(new FileReader(f), 1024 * 200); // 200kb buffer
+
+        String line = brdr.readLine();
+        while (line != null && !Thread.interrupted()) {
+          while (paused) {
+            sleep(500l); // half sec
+          }
+          if (line.length() <= 0)
+          ; // blank lines ok
+          else if (line.startsWith(COMMENT_MARKER)) {
+            if (handleComment(line, f)) {
+              // here if we got an end comment
+              break;  // out of read loop
+            }
+          }
+          else {
+            
+            String[] sa = line.split(",");
+            if (sa.length != 2) {
+              System.err.println("Error: parsing error.  Line follows.");
+              System.err.println(line);
+              byebye();
+            }
+            
+            if (startNanoTime == null)
+              startNanoTime = System.nanoTime();
+            
+            byte[] pduTimeBytes = decdr.decode(sa[0]);
+            long pduTimeInterval = Longs.fromByteArray(pduTimeBytes);
+            // This is a relative number in nanoseconds of the time of packet reception minus first packet reception for scenario.
+
+            long targetSimTime = startNanoTime + pduTimeInterval;  // when we should send the packet
+            long now = System.nanoTime();
+            long sleepTime = targetSimTime - now; //System.nanoTime(); // the difference between then and now
+
+            if (sleepTime > 20000000) { // 20 ms //
+              //System.out.println("sim interval = " + pduTimeInterval + ", sleeping for " + sleepTime/1000000l + " ms");
+              sleep(sleepTime / 1000000L, (int) (sleepTime % 1000000L));
+            }
+            
+            byte[] buffer = decdr.decode(sa[1]);
+            
+            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, port);
+            dsock.send(packet);
+            
+            pduCount++;
+            if (scenarioPduCount != null)
+              scenarioPduCount++;
+            
+            if (showPduCountsOneTime || pduCount % 5 == 0)
+              showCounts();
+          }
+          
+          line = brdr.readLine();
+        }
+        brdr.close();
+      }
+    }
+    catch (Exception ex) {
+      System.err.println("Exception reading/writing pdus: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage());
+      thrd = null;
+      closer();
+    }
+  }
+
+  private void sleep(long ms)
+  {
+    try {
+      Thread.sleep(ms);
+    }
+    catch (InterruptedException ex) {
+    }
+  }
+  
+  private void showCounts()
+  {
+    if (scenarioPduCount != null)
+      System.out.print(pduCount + " " + ++scenarioPduCount + "\r");
+    else
+      System.out.print(pduCount + "\r");
+    showPduCountsOneTime = false;
+  }
+  
+  private void byebye() throws IOException
+  {
+    System.out.println("Replay stopped.");
+    closer();
+    throw new IOException("Dis Replayer parsing error");
+  }
+  
+  private void closer()
+  {
+    try {
+      if (dsock != null) {
+        dsock.close();
+        dsock = null;
+      }
+      if (brdr != null) {
+        brdr.close();
+        brdr = null;
+      }
+    }
+    catch (Exception ioex) {
+      System.err.println("IOException closing reader in Player");
+    }
+  }
+  
+  private boolean handleComment(String s, File f)  //true if we're done
+  {
+    boolean ret = false;
+    if (s.startsWith(START_COMMENT_MARKER)) {
+      //System.out.println();
+      s = s.substring(START_COMMENT_MARKER.length());
+      System.out.println(s + "  ");
+      showPduCountsOneTime = true;  // get the first one in there
+    }
+    else if (s.startsWith(STOP_COMMENT_MARKER)) {
+      showCounts();
+      System.out.println();
+      System.out.println("End of replay from " + f.getName());
+      System.out.println(s.substring(STOP_COMMENT_MARKER.length()));
+      
+      scenarioPduCount = 0;
+      startNanoTime = null;
+      ret = true;
+    }
+    return ret;
+  }
+
+  public void startResume()
+  {
+    paused = false;
+  }
+  
+  public void stopPause()
+  {
+    paused = false;
+  }
+
+  public void end()
+  {
+    thrd.interrupt();
+    closer();
+  }
+  
+  public static void main(String[] args)
+  {
+    try {
+      //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume();
+      new Player("230.0.0.0", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath());
+    }
+    catch (Exception ex) {
+      ex.printStackTrace();
+    }
+  }
+
+  private static void sleep(long ms, int ns)
+  {
+    // @formatter:off
+    try {
+      Thread.sleep(ms, ns);
+    }
+    catch (InterruptedException ex) {
+      System.out.println("InterruptedException");
+    }
+    // @formatter:on
+  }
+}
diff --git a/Brennenstuhl/src/DISTools/PlayerTobi.java b/Brennenstuhl/src/DISTools/PlayerTobi.java
new file mode 100644
index 0000000..9619ae5
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/PlayerTobi.java
@@ -0,0 +1,484 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+/**
+ * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All
+ * rights reserved. This work is licensed under the BSD open source license,
+ * available at https://www.movesinstitute.org/licenses/bsd.html
+ */
+import static DISTools.Recorder.COMMENT_MARKER;
+import static DISTools.Recorder.START_COMMENT_MARKER;
+import static DISTools.Recorder.STOP_COMMENT_MARKER;
+import com.google.common.primitives.Longs;
+import edu.nps.moves.dis7.EntityStatePdu;
+import edu.nps.moves.dis7.Pdu;
+import edu.nps.moves.dis7.enumerations.DISPDUType;
+import edu.nps.moves.dis7.util.PduFactory;
+
+import java.io.*;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.nio.file.Path;
+import java.text.NumberFormat;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.regex.Pattern;
+
+public class PlayerTobi {
+
+    private Path disLogDirectory;
+    private String ip;
+    private int port;
+    private Thread thrd;
+
+    public PlayerTobi(String ip, int port, Path disLogDirectory) throws IOException {
+        this.disLogDirectory = disLogDirectory;
+        this.ip = ip;
+        this.port = port;
+
+        thrd = new Thread(() -> begin());
+        thrd.setPriority(Thread.NORM_PRIORITY);
+        thrd.setName("PlayerThread");
+        thrd.setDaemon(true);
+        thrd.start();
+    }
+
+    private Integer scenarioPduCount = null;
+    private boolean showPduCountsOneTime = false;
+    private int pduCount = 0;
+    private DatagramSocket dsock;
+    private BufferedReader brdr;
+    private Long startNanoTime = null;
+    private boolean paused = false;
+
+    @SuppressWarnings("StatementWithEmptyBody")
+    public void begin() {
+        try {
+            System.out.println("Replaying DIS logs.");
+            InetAddress addr = InetAddress.getByName(ip);
+
+            FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith(".");
+
+            File[] fs = disLogDirectory.toFile().listFiles(filter);
+            if (fs == null) {
+                fs = new File[0];
+            }
+
+            Arrays.sort(fs, (f1, f2) -> {
+                return f1.getName().compareTo(f2.getName());
+            });
+            //Arrays.sort(fs, Comparator.comparing(File::getName));
+
+            dsock = new DatagramSocket();
+            Base64.Decoder decdr = Base64.getDecoder();
+
+            // -------------------- Begin Variables for Position Interpolator
+            Boolean firstTimeStamp = true;
+            int firstLocalTimeStamp = 0;
+
+            double firstLocalX = 0;
+            double firstLocalY = 0;
+            double firstLocalZ = 0;
+
+            LinkedHashMap<Double, Coordinates> testMap = new LinkedHashMap<>();
+
+            //Setting up a NumberFormatter for limitting the decimal count to 3
+            NumberFormat coordinateNumberFormat = NumberFormat.getInstance(new Locale("en", "US"));
+            coordinateNumberFormat.setMaximumFractionDigits(3);
+
+            // -------------------- End Variables for Position Interpolator
+            for (File f : fs) {
+                System.out.println("Replaying " + f.getAbsolutePath());
+                brdr = new BufferedReader(new FileReader(f), 1024 * 200); // 200kb buffer
+
+                String line = brdr.readLine();
+                while (line != null && !Thread.interrupted()) {
+                    while (paused) {
+                        sleep(500l); // half sec
+                    }
+                    if (line.length() <= 0)
+          ; // blank lines ok
+                    else if (line.startsWith(COMMENT_MARKER)) {
+                        if (handleComment(line, f)) {
+                            // here if we got an end comment
+                            break;  // out of read loop
+                        }
+                    } else {
+
+                        //Pattern splitting needed for playback of unencoded streams
+                        String REGEX = "\\],\\[";
+                        Pattern pattern = Pattern.compile(REGEX);
+                        String[] sa;
+                        sa = pattern.split(line);
+                        //Add the "]" to the end of sa[0]. It was taken off by the split
+                        sa[0] = sa[0].concat("]");
+                        //Add the "]" to the end of sa[0]. It was taken off by the split
+                        sa[1] = "[".concat(sa[1]);
+                        if (sa.length != 2) {
+                            System.err.println("Error: parsing error.  Line follows.");
+                            System.err.println(line);
+                            byebye();
+                        }
+
+                        if (startNanoTime == null) {
+                            startNanoTime = System.nanoTime();
+                        }
+
+                        //byte[] pduTimeBytes = decdr.decode(sa[0]);
+                        //byte[] pduTimeBytes = sa[0].getBytes();
+                        byte[] pduTimeBytes = null;
+
+                        String[] splitString;
+
+                        //Split first String into multiple Strings cotaining integers
+                        REGEX = ",";
+                        pattern = Pattern.compile(REGEX);
+
+                        sa[0] = sa[0].substring(1, sa[0].length() - 1);
+
+                        splitString = pattern.split(sa[0]);
+
+                        //Define an array to store the in values from the string and initalize it to a value drifferent from NULL
+                        int[] arr = new int[splitString.length];
+
+                        String tempString = "";
+
+                        //Test
+                        for (int x = 0; x < splitString.length; x++) {
+
+                            tempString = splitString[x].trim();
+
+                            int tempInt = Integer.parseInt(tempString);
+                            arr[x] = tempInt;
+
+                            //System.out.println(tempInt);
+                        }
+
+                        // Credit:  https://stackoverflow.com/questions/1086054/how-to-convert-int-to-byte
+                        ByteBuffer byteBuffer1 = ByteBuffer.allocate(arr.length * 4);
+                        IntBuffer intBuffer = byteBuffer1.asIntBuffer();
+                        intBuffer.put(arr);
+
+                        pduTimeBytes = byteBuffer1.array();
+                        long pduTimeInterval = Longs.fromByteArray(pduTimeBytes);
+
+                        // This is a relative number in nanoseconds of the time of packet reception minus first packet reception for scenario.
+                        long targetSimTime = startNanoTime + pduTimeInterval;  // when we should send the packet
+                        long now = System.nanoTime();
+                        long sleepTime = targetSimTime - now; //System.nanoTime(); // the difference between then and now
+
+                        if (sleepTime > 20000000) { // 20 ms //
+                            System.out.println("sim interval = " + pduTimeInterval + ", sleeping for " + sleepTime / 1000000l + " ms");
+                            sleep(sleepTime / 1000000L, (int) (sleepTime % 1000000L));
+
+                        }
+
+                        //Handle the second String
+                        //Split second String into multiple Strings cotaining integers
+                        REGEX = ",";
+                        pattern = Pattern.compile(REGEX);
+
+                        sa[1] = sa[1].substring(1, sa[1].length() - 1);
+
+                        splitString = pattern.split(sa[1]);
+
+                        //Define an array to store the in values from the string and initalize it to a value drifferent from NULL
+                        arr = new int[splitString.length];
+
+                        //trim spaces, if any
+                        tempString = "";
+
+                        //Test
+                        for (int x = 0; x < splitString.length; x++) {
+
+                            tempString = splitString[x].trim();
+
+                            int tempInt = Integer.parseInt(tempString);
+                            arr[x] = tempInt;
+
+                            //System.out.println(tempInt);
+                        }
+
+                        // Credit:  https://stackoverflow.com/questions/1086054/how-to-convert-int-to-byte
+                        ByteBuffer byteBuffer2 = ByteBuffer.allocate(arr.length * 4);
+                        intBuffer = byteBuffer2.asIntBuffer();
+                        intBuffer.put(arr);
+
+                        //Decoding is no longer needed
+                        //byte[] buffer = decdr.decode(sa[1]);
+                        //byte[] buffer = sa[1].getBytes();
+                        byte[] buffer = byteBuffer2.array();
+
+                        //When the byteBuffer stores the arry of Integers into the byte array it store a 7 as 0 0 0 7.
+                        //Therefore a shortBuffer is created where only every forth value is stored.
+                        //it must be done with modulo instead of testing for "0" because a "0" could be there as value and not as padding
+                        byte[] bufferShort = new byte[byteBuffer2.array().length / 4];
+
+                        int bufferShortCounter = 0;
+
+                        for (int i = 1; i < byteBuffer2.array().length; i++) {
+
+                            if (((i + 1) % 4) == 0) {
+
+                                bufferShort[bufferShortCounter] = buffer[i];
+                                bufferShortCounter++;
+
+                            }
+
+                        }
+
+                        DatagramPacket packet = new DatagramPacket(bufferShort, bufferShort.length, addr, port);
+                        dsock.send(packet);
+
+                        //PDU Factory
+                        PduFactory pduFactory = new PduFactory();
+                        Pdu localPdu = null;
+
+                        if (arr[2] == 1) {
+
+                            localPdu = pduFactory.createPdu(bufferShort);
+
+                            // ToDO figure out how to do this! makeEntityStatePDU
+                            EntityStatePdu localEspdu = pduFactory.makeEntityStatePdu();
+                            //Put all the data we need into the localEspdu
+                            ByteBuffer espduBuffer = ByteBuffer.wrap(bufferShort);
+                            localEspdu.unmarshal(espduBuffer);
+
+                            double localTimeStamp = 0;
+                            double localX = 0;
+                            double localY = 0;
+                            double localZ = 0;
+
+                            //Store the first timestamp to subtract it from all others
+                            //Same with X,Y,Z to create a local coordiante system
+                            if (firstTimeStamp) {
+
+                                firstLocalTimeStamp = localPdu.getTimestamp();
+                                localTimeStamp = localPdu.getTimestamp();
+                                firstLocalX = localEspdu.getEntityLocation().getX();
+                                firstLocalY = localEspdu.getEntityLocation().getY();
+                                firstLocalZ = localEspdu.getEntityLocation().getZ();
+
+                                firstTimeStamp = false;
+                            }
+
+                            localTimeStamp = localPdu.getTimestamp();
+                            localX = localEspdu.getEntityLocation().getX();
+                            localY = localEspdu.getEntityLocation().getY();
+                            localZ = localEspdu.getEntityLocation().getZ();
+
+                            localTimeStamp = localTimeStamp - firstLocalTimeStamp;
+                            localX = localX - firstLocalX;
+                            localY = localY - firstLocalY;
+                            localZ = localZ - firstLocalZ;
+
+                            //Divide TimeStamp by 1,000,000 to get something close to a second per Unit.
+                            localTimeStamp = localTimeStamp / 1000000;
+
+                            if ((localPdu.getPduType() != null) && (localPdu.getPduType() == DISPDUType.ENTITY_STATE)) {
+
+                                //System.out.println("Timestamp: " + localTimeStamp);
+                                //String outPutString = new String("Location: x: " + localX + " y: " + localY + " z: " + localZ);
+                                //Put timestamps and coordinates in a Map to have them stored for a regression
+                                testMap.put((double) localTimeStamp, new Coordinates(localX, localY, localZ));
+                                //System.out.println(outPutString);
+                                //String positionInterpolatorString = new String(" " + coordinateNumberFormat.format(localZ) + " " + coordinateNumberFormat.format(localY) + " " + coordinateNumberFormat.format(localX));
+                                //tempKeyKeyValueSetPositionInterPolator.put(localTimeStamp, positionInterpolatorString);
+
+                            }
+
+                        }
+                        pduCount++;
+                        if (scenarioPduCount != null) {
+                            scenarioPduCount++;
+                        }
+
+                        if (showPduCountsOneTime || pduCount % 5 == 0) {
+                            showCounts();
+                        }
+                    }
+
+                    line = brdr.readLine();
+                }
+                brdr.close();
+
+                //Regression of the testMap
+                Compressor regression = new Compressor(testMap);
+
+                TreeMap<Double, Coordinates> returnMap = new TreeMap<>();
+
+                returnMap = regression.doCompression();
+                //returnMap.putAll(testMap);
+                
+                
+                //Writing all values from the KeyMap to a proper Position Interpolator String
+                System.out.println("Writing Position Interpolator");
+                Set<Double> keys = returnMap.keySet();
+                //Set<Double> keys = tempKeyKeyValueSetPositionInterPolator.keySet();
+                String key = "key = '";
+                String keyValue = "keyValue = '";
+                String interpolatorToCopy = "<PositionInterpolator DEF='Entity' ";
+
+                //Find highest time to do the normalization
+                double lastTimeStamp = 0;
+
+                for (Double k : keys) {
+
+                    if (k > lastTimeStamp) {
+
+                        lastTimeStamp = k;
+
+                    }
+                }
+
+                //Normalize all times in the set
+                var keyKeyValueSetPositionInterPolator = new LinkedHashMap<Double, String>();
+
+                for (Double k : keys) {
+
+                    String localCoordinateString;
+                    double tempX = returnMap.get(k).getX();
+                    double tempY = returnMap.get(k).getY();
+                    double tempZ = returnMap.get(k).getZ();
+                    localCoordinateString = " " + coordinateNumberFormat.format(tempX) + " " + coordinateNumberFormat.format(tempY) + " " + coordinateNumberFormat.format(tempZ);
+
+                    keyKeyValueSetPositionInterPolator.put(k / lastTimeStamp, localCoordinateString);
+
+                }
+
+                keys = keyKeyValueSetPositionInterPolator.keySet();
+
+                //Setting up the timeSensor
+                String timeSensor = "<TimeSensor DEF='PduStreamClock' cycleInterval='";
+
+                timeSensor += lastTimeStamp;
+
+                timeSensor += "' loop = 'true'/>";
+
+                //Printing the timeSensor to the console
+                System.out.println(timeSensor);
+
+                //Seting up the PositionInterpolator
+                for (Double k : keys) {
+                    //System.out.println(k+" -- " + keyKeyValuePositionInterPolator.get(k));
+                    key += coordinateNumberFormat.format(k) + " ";
+
+                    keyValue += keyKeyValueSetPositionInterPolator.get(k) + " ";
+
+                }
+                key += "' ";
+                keyValue += "' ";
+                interpolatorToCopy += key + "\n";
+                interpolatorToCopy += keyValue;
+                interpolatorToCopy += "/>";
+                //Printing PositionInterpolator to the console
+                System.out.println(interpolatorToCopy);
+            }
+        } catch (Exception ex) {
+            System.err.println("Exception reading/writing pdus: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage());
+            thrd = null;
+            closer();
+        }
+    }
+
+    private void sleep(long ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException ex) {
+        }
+    }
+
+    private void showCounts() {
+        if (scenarioPduCount != null) {
+            System.out.print(pduCount + " " + ++scenarioPduCount + "\r");
+        } else {
+            System.out.print(pduCount + "\r");
+        }
+        showPduCountsOneTime = false;
+    }
+
+    private void byebye() throws IOException {
+        System.out.println("Replay stopped.");
+        closer();
+        throw new IOException("Dis Replayer parsing error");
+    }
+
+    private void closer() {
+        try {
+            if (dsock != null) {
+                dsock.close();
+                dsock = null;
+            }
+            if (brdr != null) {
+                brdr.close();
+                brdr = null;
+            }
+        } catch (Exception ioex) {
+            System.err.println("IOException closing reader in Player");
+        }
+    }
+
+    private boolean handleComment(String s, File f) //true if we're done
+    {
+        boolean ret = false;
+        if (s.startsWith(START_COMMENT_MARKER)) {
+            //System.out.println();
+            s = s.substring(START_COMMENT_MARKER.length());
+            System.out.println(s + "  ");
+            showPduCountsOneTime = true;  // get the first one in there
+        } else if (s.startsWith(STOP_COMMENT_MARKER)) {
+            showCounts();
+            System.out.println();
+            System.out.println("End of replay from " + f.getName());
+            System.out.println(s.substring(STOP_COMMENT_MARKER.length()));
+
+            scenarioPduCount = 0;
+            startNanoTime = null;
+            ret = true;
+        }
+        return ret;
+    }
+
+    public void startResume() {
+        paused = false;
+    }
+
+    public void stopPause() {
+        paused = false;
+    }
+
+    public void end() {
+        thrd.interrupt();
+        closer();
+    }
+
+    public static void main(String[] args) {
+        try {
+            //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume();
+            new PlayerTobi("239.1.2.3", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath());
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    private static void sleep(long ms, int ns) {
+        // @formatter:off
+        try {
+            Thread.sleep(ms, ns);
+        } catch (InterruptedException ex) {
+            System.out.println("InterruptedException");
+        }
+        // @formatter:on
+    }
+}
diff --git a/Brennenstuhl/src/DISTools/Recorder.java b/Brennenstuhl/src/DISTools/Recorder.java
new file mode 100644
index 0000000..e647ece
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/Recorder.java
@@ -0,0 +1,236 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ * @author Tobias Brennenstuhl (encryption removed)
+ */
+package DISTools;
+
+import com.google.common.primitives.Longs;
+import edu.nps.moves.dis7.Pdu;
+import edu.nps.moves.dis7.enumerations.DISPDUType;
+import edu.nps.moves.dis7.util.DisNetworking;
+import edu.nps.moves.dis7.util.DisNetworking.BuffAndLength;
+import edu.nps.moves.dis7.util.PduFactory;
+import org.apache.commons.io.FilenameUtils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Base64;
+
+public class Recorder implements edu.nps.moves.dis7.util.playerrecorder.PduReceiver
+{
+  static String DEFAULT_OUTDIR = "./pdulog";
+  static String DEFAULT_FILEPREFIX = "Pdusave";
+  static String DEFAULT_MCAST = "230.0.0.0";
+  static int    DEFAULT_PORT = 3000;
+  
+  static String DISLOG_FILE_TAIL = ".dislog";
+
+  public static String COMMENT_MARKER = "!";
+  static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER;
+  static String STOP_COMMENT_MARKER = COMMENT_MARKER + "End" + COMMENT_MARKER;
+
+  private BufferedWriter bwr;
+  private File logFile;
+  private DisNetworking disnet;
+  private Thread receiverThrd;
+  
+  public Recorder() throws IOException
+  {
+    this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT);
+  }
+  
+  public Recorder(String outputDir, String mcastaddr, int port) throws IOException
+  {
+    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL );
+    bwr = new BufferedWriter(new FileWriter(logFile));
+    
+    disnet = new DisNetworking(port, mcastaddr);
+    // Start a thread to receive and record pdus
+
+    receiverThrd = new Thread(()->{
+      int count = 1;
+      while(!Thread.interrupted()){
+        try {
+          BuffAndLength blen = disnet.receiveRawPdu();
+          //System.out.println(""+ count++ +" Got pdu from DisNetworking");
+          receivePdu(blen.buff,blen.length);
+        }
+        catch(IOException ex) {
+          // this is the normal exception if you do disnet.stop()  System.err.println("Exception receiving Pdu: "+ex.getLocalizedMessage());
+        }
+      }
+    });
+    receiverThrd.setPriority(Thread.NORM_PRIORITY);
+    receiverThrd.setDaemon(true);
+    receiverThrd.start();
+  }
+  
+  public void startResume()
+  {
+    dosave = true;
+  }
+  
+  public void stopPause()
+  {
+    dosave = false;
+  }
+  
+  public String getOutputFile()
+  {
+    if(logFile != null)
+      return logFile.getAbsolutePath();
+    return null;
+  }
+  
+  public void end()
+  {
+    disnet.stop();
+    receiverThrd.interrupt();
+    
+     try {
+      writeFooter();
+      bwr.flush();
+      bwr.close();
+      System.out.println();
+      System.out.println("Recorder log file closed");
+    }
+    catch (IOException ex) {
+      System.out.println("IOException closing file: " + ex.getMessage());
+    }
+  }
+  
+  Long startNanoTime = null;
+  StringBuilder sb = new StringBuilder();
+  //Base64.Encoder encdr = Base64.getEncoder();
+  int pduCount = 0;
+  boolean headerWritten = false;
+  boolean dosave = true;
+  
+  @Override
+  public void receivePdu(byte[] buff, int len)
+  {
+    if(!dosave)
+      return;
+    
+    long packetRcvNanoTime = System.nanoTime();
+    if (startNanoTime == null)
+      startNanoTime = packetRcvNanoTime;
+
+    byte[] timeAr = Longs.toByteArray(packetRcvNanoTime - startNanoTime);
+    //System.out.println("wrote time "+(packetRcvNanoTime - startNanoTime));
+
+    sb.setLength(0);
+    //sb.append(encdr.encodeToString(timeAr));
+    sb.append(Arrays.toString(timeAr));
+    sb.append(',');
+    byte[] buffsized = Arrays.copyOf(buff, len);
+    //sb.append(encdr.encodeToString(buffsized));
+    sb.append(Arrays.toString(buffsized));
+    try {
+      if (!headerWritten) {
+        writeHeader();
+        headerWritten = true;
+      }
+      bwr.write(sb.toString());
+      bwr.newLine();
+    }
+    catch (IOException ex) {
+      System.err.println("Fatal exception writing DIS log file in Recorder.start()");
+      throw new RuntimeException(ex);
+    }
+    System.out.print(++pduCount + "\r");
+
+    //bwr.flush();
+    sb.setLength(0);
+  }
+  
+  public String getLogFile()
+  {
+    return logFile.getAbsolutePath();
+  }
+  
+  private void writeHeader() throws IOException
+  {
+    String template = "Beginning of DIS capture file, %s.";
+    String startComment = String.format(template, logFile.getName());
+    bwr.write(START_COMMENT_MARKER + startComment);
+    bwr.newLine();
+  }
+
+  private void writeFooter() throws IOException
+  {
+    String template = "End of DIS capture file, %s.";
+    String endComment = String.format(template, logFile.getName());
+    bwr.write(STOP_COMMENT_MARKER + endComment);
+    bwr.newLine();
+  }
+
+  private File makeFile(Path outputDir, String filename) throws IOException
+  {
+    String bname = FilenameUtils.getBaseName(filename);
+    String ext = FilenameUtils.getExtension(filename);
+
+    Integer count = null;
+    File f;
+    boolean fileExists;
+    outputDir.toFile().mkdirs();
+    do {
+      String fn = bname + (count == null ? "" : count) + "." + ext;
+      f = new File(outputDir.toFile(), fn);
+      fileExists = f.exists();
+      if (count == null)
+        count = 1;
+      else
+        count++;
+    } while (fileExists);
+    if (!f.createNewFile()) {
+      System.out.println("Cannot create dis log file at " + f.getAbsolutePath());
+      throw new RuntimeException("File creation error");
+    }
+    return f;
+  }
+  
+  /* Example test usage */
+  public static void main(String[] args)
+  {
+    PduFactory factory = new PduFactory(); //default appid, country, etc.
+    DisNetworking disnet = new DisNetworking(); // default ip and port
+    
+    Path path = new File("./pdulog").toPath();
+    String filename = "Pdusave";
+    
+    Recorder recorder;
+    try{recorder = new Recorder();} catch(IOException ex) {
+      System.err.println("Exception creating recorder: "+ex.getLocalizedMessage());
+      return;
+    }
+     
+    DISPDUType all[] = DISPDUType.values();
+    Arrays.stream(all).forEach(typ-> {
+      if(typ != DISPDUType.OTHER) {
+        try {
+          Pdu pdu = factory.createPdu(typ);
+          disnet.sendPdu(pdu);
+          sleep(100);
+        }
+        catch(Exception ex) {
+          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
+        }
+      }
+      });
+    sleep(2000L);
+    
+    recorder.end();
+  }
+  
+  private static void sleep(long ms)
+  {
+    try{Thread.sleep(ms);}catch(InterruptedException ex) {}
+  }
+}
diff --git a/Brennenstuhl/src/DISTools/RecorderTobi.java b/Brennenstuhl/src/DISTools/RecorderTobi.java
new file mode 100644
index 0000000..a1774fb
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/RecorderTobi.java
@@ -0,0 +1,237 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+import com.google.common.primitives.Longs;
+
+import edu.nps.moves.dis7.Pdu;
+import edu.nps.moves.dis7.enumerations.DISPDUType;
+import edu.nps.moves.dis7.util.DisNetworking;
+import edu.nps.moves.dis7.util.DisNetworking.BuffAndLength;
+import edu.nps.moves.dis7.util.PduFactory;
+import org.apache.commons.io.FilenameUtils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Arrays;
+
+
+public class RecorderTobi implements PduReceiver
+{
+  static String DEFAULT_OUTDIR = "./pdulog";
+  static String DEFAULT_FILEPREFIX = "Pdusave";
+  static String DEFAULT_MCAST = "239.1.2.3";
+  static int    DEFAULT_PORT = 3000;
+  
+  static String DISLOG_FILE_TAIL = ".dislog";
+
+  public static String COMMENT_MARKER = "!";
+  static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER;
+  static String STOP_COMMENT_MARKER = COMMENT_MARKER + "End" + COMMENT_MARKER;
+
+  private BufferedWriter bwr;
+  private File logFile;
+  private DisNetworking disnet;
+  private Thread receiverThrd;
+  
+  public RecorderTobi() throws IOException
+  {
+    this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT);
+  }
+  
+  public RecorderTobi(String outputDir, String mcastaddr, int port) throws IOException
+  {
+    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL );
+    bwr = new BufferedWriter(new FileWriter(logFile));
+    
+    disnet = new DisNetworking(port, mcastaddr);
+    // Start a thread to receive and record pdus
+
+    receiverThrd = new Thread(()->{
+      int count = 1;
+      while(!Thread.interrupted()){
+        try {
+          BuffAndLength blen = disnet.receiveRawPdu();
+          //System.out.println(""+ count++ +" Got pdu from DisNetworking");
+          receivePdu(blen.buff,blen.length);
+        }
+        catch(IOException ex) {
+          // this is the normal exception if you do disnet.stop()  System.err.println("Exception receiving Pdu: "+ex.getLocalizedMessage());
+        }
+      }
+    });
+    receiverThrd.setPriority(Thread.NORM_PRIORITY);
+    receiverThrd.setDaemon(true);
+    receiverThrd.start();
+  }
+  
+  public void startResume()
+  {
+    dosave = true;
+  }
+  
+  public void stopPause()
+  {
+    dosave = false;
+  }
+  
+  public String getOutputFile()
+  {
+    if(logFile != null)
+      return logFile.getAbsolutePath();
+    return null;
+  }
+  
+  public void end()
+  {
+    disnet.stop();
+    receiverThrd.interrupt();
+    
+     try {
+      writeFooter();
+      bwr.flush();
+      bwr.close();
+      System.out.println();
+      System.out.println("Recorder log file closed");
+    }
+    catch (IOException ex) {
+      System.out.println("IOException closing file: " + ex.getMessage());
+    }
+  }
+  
+  Long startNanoTime = null;
+  StringBuilder sb = new StringBuilder();
+  // Base64.Encoder encdr = Base64.getEncoder();
+  int pduCount = 0;
+  boolean headerWritten = false;
+  boolean dosave = true;
+  
+  @Override
+  public void receivePdu(byte[] buff, int len)
+  {
+    if(!dosave)
+      return;
+    
+    long packetRcvNanoTime = System.nanoTime();
+    if (startNanoTime == null)
+      startNanoTime = packetRcvNanoTime;
+
+    byte[] timeAr = Longs.toByteArray(packetRcvNanoTime - startNanoTime);
+    //System.out.println("wrote time "+(packetRcvNanoTime - startNanoTime));
+
+    sb.setLength(0);
+    //sb.append(encdr.encodeToString(timeAr));
+    sb.append(Arrays.toString(timeAr));
+    sb.append(',');
+    byte[] buffsized = Arrays.copyOf(buff, len);
+    //sb.append(encdr.encodeToString(buffsized));
+    sb.append(Arrays.toString(buffsized));
+    try {
+      if (!headerWritten) {
+        writeHeader();
+        headerWritten = true;
+      }
+      //Added a REGEX to strip all spaces from the string before writing to file
+      bwr.write(sb.toString().replaceAll("\\s",""));
+      bwr.newLine();
+    }
+    catch (IOException ex) {
+      System.err.println("Fatal exception writing DIS log file in Recorder.start()");
+      throw new RuntimeException(ex);
+    }
+    System.out.print(++pduCount + "\r");
+
+    //bwr.flush();
+    sb.setLength(0);
+  }
+  
+  public String getLogFile()
+  {
+    return logFile.getAbsolutePath();
+  }
+  
+  private void writeHeader() throws IOException
+  {
+    String template = "Beginning of DIS capture file, %s. [PDU Header],[PDU Stream]";
+    String startComment = String.format(template, logFile.getName());
+    bwr.write(START_COMMENT_MARKER + startComment);
+    bwr.newLine();
+  }
+
+  private void writeFooter() throws IOException
+  {
+    String template = "End of DIS capture file, %s.";
+    String endComment = String.format(template, logFile.getName());
+    bwr.write(STOP_COMMENT_MARKER + endComment);
+    bwr.newLine();
+  }
+
+  private File makeFile(Path outputDir, String filename) throws IOException
+  {
+    String bname = FilenameUtils.getBaseName(filename);
+    String ext = FilenameUtils.getExtension(filename);
+
+    Integer count = null;
+    File f;
+    boolean fileExists;
+    outputDir.toFile().mkdirs();
+    do {
+      String fn = bname + (count == null ? "" : count) + "." + ext;
+      f = new File(outputDir.toFile(), fn);
+      fileExists = f.exists();
+      if (count == null)
+        count = 1;
+      else
+        count++;
+    } while (fileExists);
+    if (!f.createNewFile()) {
+      System.out.println("Cannot create dis log file at " + f.getAbsolutePath());
+      throw new RuntimeException("File creation error");
+    }
+    return f;
+  }
+  
+  /* Example test usage */
+  public static void main(String[] args)
+  {
+    PduFactory factory = new PduFactory(); //default appid, country, etc.
+    DisNetworking disnet = new DisNetworking(); // default ip and port
+    
+    Path path = new File("./pdulog").toPath();
+    String filename = "Pdusave";
+    
+    RecorderTobi recorder;
+    try{recorder = new RecorderTobi();} catch(IOException ex) {
+      System.err.println("Exception creating recorder: "+ex.getLocalizedMessage());
+      return;
+    }
+     
+    DISPDUType all[] = DISPDUType.values();
+    Arrays.stream(all).forEach(typ-> {
+      if(typ != DISPDUType.OTHER) {
+        try {
+          Pdu pdu = factory.createPdu(typ);
+          disnet.sendPdu(pdu);
+          sleep(100);
+        }
+        catch(Exception ex) {
+          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
+        }
+      }
+      });
+    sleep(2000);
+    
+    recorder.end();
+  }
+  
+  private static void sleep(long ms)
+  {
+    try{Thread.sleep(ms);}catch(InterruptedException ex) {}
+  }
+}
diff --git a/Brennenstuhl/src/DISTools/SimpleSenderGUI.java b/Brennenstuhl/src/DISTools/SimpleSenderGUI.java
new file mode 100644
index 0000000..f7ba040
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/SimpleSenderGUI.java
@@ -0,0 +1,400 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.io.File;
+import java.text.NumberFormat;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JButton;
+import javax.swing.JFormattedTextField;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
+import static javax.swing.JOptionPane.OK_OPTION;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.text.NumberFormatter;
+
+/**
+ *
+ * @author Tobias Brennenstuhl
+ */
+public final class SimpleSenderGUI extends JFrame implements Runnable {
+
+    private JButton defaultButton;
+    private JButton clearButton;
+    private JButton exitButton;
+    private JButton receiveButton;
+    private JButton sendButton;
+    private JMenuItem openMenuItem;
+    private JMenuItem saveMenuItem;
+    private DefaultActionListener defaultActionListener;
+    private ClearActionListener clearActionListener;
+    private ExitActionListener exitActionListener;
+    private ReceiveActionListener receiveActionListener;
+    private SendActionListener sendActionListener;
+    private JTextArea outputArea;
+    private JLabel packetsToSendTextFieldLabel;
+    private JFormattedTextField packetsToSendTextField;
+    private JLabel ipToSendTextFieldLabel;
+    private JTextField ipToSendTextField;
+    private JLabel portToSendTextFieldLabel;
+    private JFormattedTextField portToSendTextField;
+
+    private JPanel panel;
+    private JPanel panel2;
+    private EspduSender simpleSender = new EspduSender();
+    private EspduReceiver simpleReceiver = new EspduReceiver();
+    private JMenuBar menuBar;
+    private JMenu fileMenu;
+    private JMenu editMenu;
+    private JMenu helpMenu;
+    private JMenuItem helpMenuItem;
+    private JMenuItem exitMenuItem;
+    private HelpActionListener helpActionListener;
+
+    public SimpleSenderGUI() {
+
+        super("DIS Sender/Receiver GUI");
+
+        exitActionListener = new ExitActionListener();
+        this.addWindowListener(exitActionListener);
+
+        this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+        this.setSize(600, 500);
+        this.setLocation(400, 300);
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
+            Logger.getLogger(SimpleSenderGUI.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        init();
+    }
+
+    /**
+     * Initialize all the widgets, hook up listeners, and place them in the
+     * window
+     */
+    protected void init() {
+        //The panel will hold all of our stuff
+        panel = new JPanel(new GridLayout(1, 5));
+        getContentPane().add(panel, BorderLayout.NORTH);
+
+        //Instantiate the JLabel and add to the panel
+        panel2 = new JPanel(new GridLayout(1, 1));
+        getContentPane().add(panel2, BorderLayout.SOUTH);
+
+        //Setup a textfield for the IP adress
+        ipToSendTextFieldLabel = new JLabel("IP Address:");
+        ipToSendTextField = new JTextField("239.1.2.3");
+        panel2.add(ipToSendTextFieldLabel);
+        panel2.add(ipToSendTextField);
+
+        //Setup a textfield for the Port that allows integer only
+        //Credit: https://stackoverflow.com/questions/11093326/restricting-jtextfield-input-to-integers
+        
+
+        NumberFormat longFormat = NumberFormat.getIntegerInstance();
+        NumberFormatter formatter = new NumberFormatter(longFormat);
+       
+        formatter.setValueClass(Integer.class);
+        formatter.setMinimum(1);
+        formatter.setMaximum(5000);
+        formatter.setAllowsInvalid(false);
+        portToSendTextFieldLabel = new JLabel("Port:");
+        portToSendTextField = new JFormattedTextField(formatter);
+        portToSendTextField.setValue(3000);
+        panel2.add(portToSendTextFieldLabel);
+        panel2.add(portToSendTextField);
+
+        //Setup a textfield for number of packets that allows integer only         
+        packetsToSendTextField = new JFormattedTextField(formatter);
+        packetsToSendTextField.setValue(5);
+        packetsToSendTextFieldLabel = new JLabel("# of Packets:");
+        panel2.add(packetsToSendTextFieldLabel);
+        panel2.add(packetsToSendTextField);
+
+        //Instantiate the TextArea and make it scrollable
+        outputArea = new JTextArea();
+        JScrollPane scrollPane = new JScrollPane(outputArea);
+        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+        getContentPane().add(scrollPane, BorderLayout.CENTER);
+        
+
+        //Instantiate the OpenButton and add the ActionListener
+        defaultButton = new JButton("Default");
+        panel.add(defaultButton);
+        defaultActionListener = new DefaultActionListener();
+        defaultButton.addActionListener(defaultActionListener);
+
+        //Instantiate the SaveButton and add the ActionListener
+        clearButton = new JButton("Clear");
+        panel.add(clearButton);
+        clearActionListener = new ClearActionListener();
+        clearButton.addActionListener(clearActionListener);
+
+        //Instantiate the ReceiveButton and add the ActionListener
+        receiveButton = new JButton("Receive");
+        receiveActionListener = new ReceiveActionListener();
+        receiveButton.addActionListener(receiveActionListener);
+        panel.add(receiveButton);
+
+                
+        //Instantiate the SendButton and add the ActionListener
+        sendButton = new JButton("Send");
+        sendActionListener = new SendActionListener();
+        sendButton.addActionListener(sendActionListener);
+        panel.add(sendButton);
+
+        //Instantiate the ExitButton and add the ActionListener
+        exitButton = new JButton("Exit");
+        exitButton.addActionListener(exitActionListener);
+        panel.add(exitButton);
+
+        //Instatiate a MenuBar
+        menuBar = new JMenuBar();
+        setJMenuBar(menuBar);
+
+        //Instantiate the fileMenuItem
+        fileMenu = new JMenu("File");
+        menuBar.add(fileMenu);
+
+        //Instantiate the editMenuItem
+        editMenu = new JMenu("Edit");
+        menuBar.add(editMenu);
+
+        //Instantiate the helpMenuItem
+        helpMenu = new JMenu("Help");
+        menuBar.add(helpMenu);
+
+        //Instantiate the openMenuItem and add it to the fileMenu
+        openMenuItem = new JMenuItem("Open");
+        helpActionListener = new HelpActionListener();
+        openMenuItem.addActionListener(defaultActionListener);
+        fileMenu.add(openMenuItem);
+
+        //Instantiate the saveMenuItem and add it to the fileMenu
+        saveMenuItem = new JMenuItem("Save");
+        saveMenuItem.addActionListener(clearActionListener);
+        saveMenuItem.setEnabled(false);
+        fileMenu.add(saveMenuItem);
+        fileMenu.addSeparator();
+
+        //Instantiate the helpMenuItem and add it to the helpMenu
+        helpMenuItem = new JMenuItem("Help");
+        helpMenuItem.addActionListener(helpActionListener);
+        helpMenu.add(helpMenuItem);
+
+        //Instantiate the ExitMenuItem and add it to the exitMenu
+        exitMenuItem = new JMenuItem("Exit");
+        exitMenuItem.addActionListener(exitActionListener);
+        fileMenu.add(exitMenuItem);
+
+    }
+
+    ;
+
+    //Run our window and set it to visible
+    @Override
+    public void run() {
+        setVisible(true);
+
+    }
+
+    //ActionListener for SendButton
+    private class SendActionListener implements ActionListener {
+
+        public SendActionListener() {
+
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            int temp;
+
+            if (packetsToSendTextField.getValue() == null) {
+
+                temp = 1;
+
+            } else {
+
+                temp = (int) packetsToSendTextField.getValue();
+            }
+
+            for (int i = 0; i < temp; i++) {
+
+                String tempIpString;
+                //tempIpString = new String();
+                tempIpString = ipToSendTextField.getText();
+                int tempPort;
+                tempPort = (int) portToSendTextField.getValue();
+                String tempTextforOurputArea = simpleSender.send(tempIpString, tempPort);
+                outputArea.append(tempTextforOurputArea);
+                outputArea.update(outputArea.getGraphics());
+            }
+
+        }
+    }
+    
+    ////ActionListener for ReceiveButton
+    private class ReceiveActionListener implements ActionListener {
+
+        public ReceiveActionListener() {
+
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            int temp;
+
+            if (packetsToSendTextField.getValue() == null) {
+
+                temp = 1;
+
+            } else {
+
+                temp = (int) packetsToSendTextField.getValue();
+            }
+
+            for (int i = 0; i < temp; i++) {
+
+                String tempIpString;
+                //tempIpString = new String();
+                tempIpString = ipToSendTextField.getText();
+                int tempPort;
+                tempPort = (int) portToSendTextField.getValue();
+
+                outputArea.append(simpleReceiver.receive(tempIpString, tempPort));
+                outputArea.update(outputArea.getGraphics());
+            }
+
+        }
+    }
+    
+    
+    
+    
+    
+
+    //ActionListener for HelpMenuItem
+    private class HelpActionListener implements ActionListener {
+
+        /**
+         * Gives the user a Message with some help
+         *
+         *
+         * @param e Given ActionEvent
+         */
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            System.out.println("Help");
+
+            JOptionPane.showMessageDialog(SimpleSenderGUI.this,
+                    "Type in the IP-adress and the Port you would like to send\n"
+                    + "DIS Packets to. Add the number of Packets and hit send. \n\n"
+                    + " ", "Help", JOptionPane.PLAIN_MESSAGE);
+
+        }
+
+    }
+
+    //ActionListener for OpenMenuItem and OpenButton
+    private class DefaultActionListener implements ActionListener {
+
+        public DefaultActionListener() {
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            System.out.println("Default Values restored");
+            
+            ipToSendTextField.setText("239.1.2.3");
+            portToSendTextField.setValue(3000);
+            packetsToSendTextField.setValue(5);
+
+            outputArea.append("Default Values restored. \n");
+            
+
+        }
+
+    }
+
+    //ActionListener for SaveMenuItem and SaveButton
+    private class ClearActionListener implements ActionListener {
+
+        private File outputFile;
+
+        public ClearActionListener() {
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            outputArea.append("Display will be cleared in 2 seconds. \n");
+            outputArea.update(outputArea.getGraphics());
+            System.out.println("Clearing display area ...");
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException ex) {
+                Logger.getLogger(SimpleSenderGUI.class.getName()).log(Level.SEVERE, null, ex);
+            }
+            outputArea.setText("");
+        }
+
+    }
+
+    //ActionListener for ExitMenuItem, ExitButton and WindowAdapter
+    private class ExitActionListener extends WindowAdapter implements ActionListener, WindowListener {
+
+        /**
+         * Prompts the user with JOptionPane.showConformDialog(); will only exit
+         * if the user clicks "OK" but will do nothing if the user clicks
+         * "Cancel"
+         *
+         * Credits to Class-Code ;-) CS2173
+         *
+         * @param e Given ActionEvent
+         */
+        @Override
+        public void actionPerformed(ActionEvent e) {
+
+            System.out.println("Exit");
+
+            int confirm = JOptionPane.showConfirmDialog(SimpleSenderGUI.this,
+                    "Really Exit?", "Confirm Exit", OK_CANCEL_OPTION);
+            if (confirm == OK_OPTION) {
+                System.exit(0);
+            }
+        }
+
+        @Override
+        public void windowClosing(WindowEvent e) {
+            actionPerformed(null);
+        }
+
+    }
+
+}
diff --git a/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java b/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java
new file mode 100644
index 0000000..2fd483f
--- /dev/null
+++ b/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package DISTools;
+
+import javax.swing.SwingUtilities;
+
+/**
+ *
+ * @author Tobias Brennenstuhl
+ */
+public class SimpleSenderGUIMain {
+
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String[] args) {
+
+        //Instantiate a SimpleSenderGUI
+        SimpleSenderGUI simpleSenderGUI;
+
+        simpleSenderGUI = new SimpleSenderGUI();
+        SwingUtilities.invokeLater(simpleSenderGUI);
+
+        //Run our instance of SimpleSenderWordGUI
+        simpleSenderGUI.run();
+    }
+
+}
-- 
GitLab