Pārlūkot izejas kodu

Merge branch 'a1' into 'master'

A1 Test Submission

See merge request !2

Tareef Saleem Dedhar 6 gadi atpakaļ
vecāks
revīzija
f21248b7da
46 mainītis faili ar 2499 papildinājumiem un 0 dzēšanām
  1. BIN
      assignments/a0/.gradle/4.7/fileChanges/last-build.bin
  2. BIN
      assignments/a0/.gradle/4.7/fileContent/annotation-processors.bin
  3. BIN
      assignments/a0/.gradle/4.7/fileContent/fileContent.lock
  4. BIN
      assignments/a0/.gradle/4.7/fileHashes/fileHashes.bin
  5. BIN
      assignments/a0/.gradle/4.7/fileHashes/fileHashes.lock
  6. BIN
      assignments/a0/.gradle/4.7/fileHashes/resourceHashesCache.bin
  7. BIN
      assignments/a0/.gradle/4.7/taskHistory/taskHistory.bin
  8. BIN
      assignments/a0/.gradle/4.7/taskHistory/taskHistory.lock
  9. BIN
      assignments/a0/.gradle/buildOutputCleanup/buildOutputCleanup.lock
  10. 2 0
      assignments/a0/.gradle/buildOutputCleanup/cache.properties
  11. BIN
      assignments/a0/.gradle/buildOutputCleanup/outputFiles.bin
  12. 0 0
      assignments/a0/.gradle/vcsWorkingDirs/gc.properties
  13. 90 0
      assignments/a0/a0.iml
  14. 104 0
      assignments/a0/a0.ipr
  15. 207 0
      assignments/a0/a0.iws
  16. 36 0
      assignments/a0/build.gradle
  17. BIN
      assignments/a0/build/classes/java/main/App.class
  18. BIN
      assignments/a0/build/classes/java/main/Hello.class
  19. BIN
      assignments/a0/build/classes/java/main/Main.class
  20. BIN
      assignments/a0/build/classes/java/test/AppTest.class
  21. BIN
      assignments/a0/build/distributions/a0.tar
  22. BIN
      assignments/a0/build/distributions/a0.zip
  23. BIN
      assignments/a0/build/libs/a0.jar
  24. 96 0
      assignments/a0/build/reports/tests/test/classes/AppTest.html
  25. 179 0
      assignments/a0/build/reports/tests/test/css/base-style.css
  26. 84 0
      assignments/a0/build/reports/tests/test/css/style.css
  27. 132 0
      assignments/a0/build/reports/tests/test/index.html
  28. 194 0
      assignments/a0/build/reports/tests/test/js/report.js
  29. 103 0
      assignments/a0/build/reports/tests/test/packages/default-package.html
  30. 172 0
      assignments/a0/build/scripts/a0
  31. 84 0
      assignments/a0/build/scripts/a0.bat
  32. 7 0
      assignments/a0/build/test-results/test/TEST-AppTest.xml
  33. 0 0
      assignments/a0/build/test-results/test/binary/output.bin
  34. BIN
      assignments/a0/build/test-results/test/binary/output.bin.idx
  35. BIN
      assignments/a0/build/test-results/test/binary/results.bin
  36. 2 0
      assignments/a0/build/tmp/jar/MANIFEST.MF
  37. BIN
      assignments/a0/gradle/wrapper/gradle-wrapper.jar
  38. 5 0
      assignments/a0/gradle/wrapper/gradle-wrapper.properties
  39. 172 0
      assignments/a0/gradlew
  40. 84 0
      assignments/a0/gradlew.bat
  41. 10 0
      assignments/a0/settings.gradle
  42. 12 0
      assignments/a0/src/main/java/App.java
  43. 12 0
      assignments/a0/src/test/java/AppTest.java
  44. 19 0
      assignments/a1/Makefile
  45. BIN
      assignments/a1/snake
  46. 693 0
      assignments/a1/snake.cc

BIN
assignments/a0/.gradle/4.7/fileChanges/last-build.bin


BIN
assignments/a0/.gradle/4.7/fileContent/annotation-processors.bin


BIN
assignments/a0/.gradle/4.7/fileContent/fileContent.lock


BIN
assignments/a0/.gradle/4.7/fileHashes/fileHashes.bin


BIN
assignments/a0/.gradle/4.7/fileHashes/fileHashes.lock


BIN
assignments/a0/.gradle/4.7/fileHashes/resourceHashesCache.bin


BIN
assignments/a0/.gradle/4.7/taskHistory/taskHistory.bin


BIN
assignments/a0/.gradle/4.7/taskHistory/taskHistory.lock


BIN
assignments/a0/.gradle/buildOutputCleanup/buildOutputCleanup.lock


+ 2 - 0
assignments/a0/.gradle/buildOutputCleanup/cache.properties

@@ -0,0 +1,2 @@
+#Thu May 31 13:03:50 EDT 2018
+gradle.version=4.7

BIN
assignments/a0/.gradle/buildOutputCleanup/outputFiles.bin


+ 0 - 0
assignments/a0/.gradle/vcsWorkingDirs/gc.properties


+ 90 - 0
assignments/a0/a0.iml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output/>
+    <orderEntry type="inheritedJdk"/>
+    <content url="file://$MODULE_DIR$/">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false"/>
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true"/>
+      <excludeFolder url="file://$MODULE_DIR$/.gradle"/>
+      <excludeFolder url="file://$MODULE_DIR$/build"/>
+    </content>
+    <orderEntry type="sourceFolder" forTests="false"/>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/23.0/c947004bb13d18182be60077ade044099e4f26f1/guava-23.0.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/23.0/ed233607c5c11e1a13a3fd760033ed5d9fe525c2/guava-23.0-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES/>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.0.18/5f65affce1684999e2f4024983835efc3504012e/error_prone_annotations-2.0.18.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.0.18/220c1232fa6d13b427c10ccc1243a87f5f501d31/error_prone_annotations-2.0.18-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/976d8d30bebc251db406f2bdb3eb01962b5685b3/j2objc-annotations-1.1.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/dcd31de68a90e41e336f6b7afce0d39285c433d7/j2objc-annotations-1.1-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.14/775b7e22fb10026eed3f86e8dc556dfafe35f2d5/animal-sniffer-annotations-1.14.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.14/886474da3f761d39fcbb723d97ecc5089e731f42/animal-sniffer-annotations-1.14-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/a6c32b40bf3d76eca54e3c601e5d1470c86fcdfa/junit-4.12-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library" scope="TEST">
+      <library>
+        <CLASSES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar!/"/>
+        </CLASSES>
+        <JAVADOC/>
+        <SOURCES>
+          <root url="jar:///home/tdedhar/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar!/"/>
+        </SOURCES>
+      </library>
+    </orderEntry>
+  </component>
+  <component name="ModuleRootManager"/>
+</module>

+ 104 - 0
assignments/a0/a0.ipr

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac"/>
+    <resourceExtensions>
+      <entry name=".+\.(properties|xml|html|dtd|tld)"/>
+      <entry name=".+\.(gif|png|jpeg|jpg)"/>
+    </resourceExtensions>
+    <wildcardResourcePatterns>
+      <entry name="!?*.class"/>
+      <entry name="!?*.scala"/>
+      <entry name="!?*.groovy"/>
+      <entry name="!?*.java"/>
+    </wildcardResourcePatterns>
+    <annotationProcessing enabled="false" useClasspath="true"/>
+    <bytecodeTargetLevel target="1.10"/>
+  </component>
+  <component name="CopyrightManager" default="">
+    <module2copyright/>
+  </component>
+  <component name="DependencyValidationManager">
+    <option name="SKIP_IMPORT_STATEMENTS" value="false"/>
+  </component>
+  <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false"/>
+  <component name="GradleUISettings">
+    <setting name="root"/>
+  </component>
+  <component name="GradleUISettings2">
+    <setting name="root"/>
+  </component>
+  <component name="IdProvider" IDEtalkID="11DA1DB66DD62DDA1ED602B7079FE97C"/>
+  <component name="JavadocGenerationManager">
+    <option name="OUTPUT_DIRECTORY"/>
+    <option name="OPTION_SCOPE" value="protected"/>
+    <option name="OPTION_HIERARCHY" value="true"/>
+    <option name="OPTION_NAVIGATOR" value="true"/>
+    <option name="OPTION_INDEX" value="true"/>
+    <option name="OPTION_SEPARATE_INDEX" value="true"/>
+    <option name="OPTION_DOCUMENT_TAG_USE" value="false"/>
+    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false"/>
+    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false"/>
+    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true"/>
+    <option name="OPTION_DEPRECATED_LIST" value="true"/>
+    <option name="OTHER_OPTIONS" value=""/>
+    <option name="HEAP_SIZE"/>
+    <option name="LOCALE"/>
+    <option name="OPEN_IN_BROWSER" value="true"/>
+  </component>
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/a0.iml" filepath="$PROJECT_DIR$/a0.iml"/>
+    </modules>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_10" assert-keyword="false" jdk-15="true" project-jdk-type="JavaSDK" assert-jdk-15="false" project-jdk-name="1.10">
+    <output url="file://$PROJECT_DIR$/out"/>
+  </component>
+  <component name="SvnBranchConfigurationManager">
+    <option name="mySupportsUserInfoFilter" value="true"/>
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs=""/>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ArtifactsStructureConfigurable.UI">
+        <UIState>
+          <splitter-proportions>
+            <SplitterProportionsDataImpl/>
+          </splitter-proportions>
+          <settings/>
+        </UIState>
+      </state>
+      <state key="Copyright.UI">
+        <UIState>
+          <splitter-proportions>
+            <SplitterProportionsDataImpl/>
+          </splitter-proportions>
+        </UIState>
+      </state>
+      <state key="ProjectJDKs.UI">
+        <UIState>
+          <splitter-proportions>
+            <SplitterProportionsDataImpl>
+              <option name="proportions">
+                <list>
+                  <option value="0.2"/>
+                </list>
+              </option>
+            </SplitterProportionsDataImpl>
+          </splitter-proportions>
+          <last-edited>1.6</last-edited>
+        </UIState>
+      </state>
+      <state key="ScopeChooserConfigurable.UI">
+        <UIState>
+          <splitter-proportions>
+            <SplitterProportionsDataImpl/>
+          </splitter-proportions>
+          <settings/>
+        </UIState>
+      </state>
+    </states>
+  </component>
+</project>

+ 207 - 0
assignments/a0/a0.iws

@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <option name="TRACKING_ENABLED" value="true"/>
+    <option name="SHOW_DIALOG" value="false"/>
+    <option name="HIGHLIGHT_CONFLICTS" value="true"/>
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false"/>
+    <option name="LAST_RESOLUTION" value="IGNORE"/>
+  </component>
+  <component name="ChangesViewManager" flattened_view="true" show_ignored="false"/>
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value=""/>
+    <option name="REVERSE_PATCH" value="false"/>
+  </component>
+  <component name="DaemonCodeAnalyzer">
+    <disable_hints/>
+  </component>
+  <component name="DebuggerManager">
+    <breakpoint_any>
+      <breakpoint>
+        <option name="NOTIFY_CAUGHT" value="true"/>
+        <option name="NOTIFY_UNCAUGHT" value="true"/>
+        <option name="ENABLED" value="false"/>
+        <option name="LOG_ENABLED" value="false"/>
+        <option name="LOG_EXPRESSION_ENABLED" value="false"/>
+        <option name="SUSPEND_POLICY" value="SuspendAll"/>
+        <option name="COUNT_FILTER_ENABLED" value="false"/>
+        <option name="COUNT_FILTER" value="0"/>
+        <option name="CONDITION_ENABLED" value="false"/>
+        <option name="CLASS_FILTERS_ENABLED" value="false"/>
+        <option name="INSTANCE_FILTERS_ENABLED" value="false"/>
+        <option name="CONDITION" value=""/>
+        <option name="LOG_MESSAGE" value=""/>
+      </breakpoint>
+      <breakpoint>
+        <option name="NOTIFY_CAUGHT" value="true"/>
+        <option name="NOTIFY_UNCAUGHT" value="true"/>
+        <option name="ENABLED" value="false"/>
+        <option name="LOG_ENABLED" value="false"/>
+        <option name="LOG_EXPRESSION_ENABLED" value="false"/>
+        <option name="SUSPEND_POLICY" value="SuspendAll"/>
+        <option name="COUNT_FILTER_ENABLED" value="false"/>
+        <option name="COUNT_FILTER" value="0"/>
+        <option name="CONDITION_ENABLED" value="false"/>
+        <option name="CLASS_FILTERS_ENABLED" value="false"/>
+        <option name="INSTANCE_FILTERS_ENABLED" value="false"/>
+        <option name="CONDITION" value=""/>
+        <option name="LOG_MESSAGE" value=""/>
+      </breakpoint>
+    </breakpoint_any>
+    <breakpoint_rules/>
+    <ui_properties/>
+  </component>
+  <component name="ModuleEditorState">
+    <option name="LAST_EDITED_MODULE_NAME"/>
+    <option name="LAST_EDITED_TAB_NAME"/>
+  </component>
+  <component name="ProjectInspectionProfilesVisibleTreeState">
+    <entry key="Project Default">
+      <profile-state/>
+    </entry>
+  </component>
+  <component name="ProjectLevelVcsManager">
+    <OptionsSetting value="true" id="Add"/>
+    <OptionsSetting value="true" id="Remove"/>
+    <OptionsSetting value="true" id="Checkout"/>
+    <OptionsSetting value="true" id="Update"/>
+    <OptionsSetting value="true" id="Status"/>
+    <OptionsSetting value="true" id="Edit"/>
+    <ConfirmationsSetting value="0" id="Add"/>
+    <ConfirmationsSetting value="0" id="Remove"/>
+  </component>
+  <component name="ProjectReloadState">
+    <option name="STATE" value="0"/>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="GoToFile.includeJavaFiles" value="false"/>
+    <property name="GoToClass.toSaveIncludeLibraries" value="false"/>
+    <property name="MemberChooser.sorted" value="false"/>
+    <property name="MemberChooser.showClasses" value="true"/>
+    <property name="GoToClass.includeLibraries" value="false"/>
+    <property name="MemberChooser.copyJavadoc" value="false"/>
+  </component>
+  <component name="RunManager">
+    <configuration default="true" type="Remote" factoryName="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true"/>
+      <option name="SERVER_MODE" value="false"/>
+      <option name="SHMEM_ADDRESS" value="javadebug"/>
+      <option name="HOST" value="localhost"/>
+      <option name="PORT" value="5005"/>
+      <method>
+        <option name="BuildArtifacts" enabled="false"/>
+      </method>
+    </configuration>
+    <configuration default="true" type="Applet" factoryName="Applet">
+      <module name=""/>
+      <option name="MAIN_CLASS_NAME"/>
+      <option name="HTML_FILE_NAME"/>
+      <option name="HTML_USED" value="false"/>
+      <option name="WIDTH" value="400"/>
+      <option name="HEIGHT" value="300"/>
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy"/>
+      <option name="VM_PARAMETERS"/>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false"/>
+      <option name="ALTERNATIVE_JRE_PATH"/>
+      <method>
+        <option name="BuildArtifacts" enabled="false"/>
+        <option name="Make" enabled="true"/>
+      </method>
+    </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <extension name="coverage" enabled="false" merge="false"/>
+      <option name="MAIN_CLASS_NAME"/>
+      <option name="VM_PARAMETERS"/>
+      <option name="PROGRAM_PARAMETERS"/>
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false"/>
+      <option name="ALTERNATIVE_JRE_PATH"/>
+      <option name="ENABLE_SWING_INSPECTOR" value="false"/>
+      <option name="ENV_VARIABLES"/>
+      <option name="PASS_PARENT_ENVS" value="true"/>
+      <module name=""/>
+      <envs/>
+      <method>
+        <option name="BuildArtifacts" enabled="false"/>
+        <option name="Make" enabled="true"/>
+      </method>
+    </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <extension name="coverage" enabled="false" merge="false"/>
+      <module name=""/>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false"/>
+      <option name="ALTERNATIVE_JRE_PATH"/>
+      <option name="PACKAGE_NAME"/>
+      <option name="MAIN_CLASS_NAME"/>
+      <option name="METHOD_NAME"/>
+      <option name="TEST_OBJECT" value="class"/>
+      <option name="VM_PARAMETERS"/>
+      <option name="PARAMETERS"/>
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>
+      <option name="ENV_VARIABLES"/>
+      <option name="PASS_PARENT_ENVS" value="true"/>
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="moduleWithDependencies"/>
+      </option>
+      <envs/>
+      <method>
+        <option name="BuildArtifacts" enabled="false"/>
+        <option name="Make" enabled="true"/>
+      </method>
+    </configuration>
+    <list size="0"/>
+    <configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
+      <Host>localhost</Host>
+      <Port>5050</Port>
+    </configuration>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false"/>
+  <component name="SvnConfiguration" maxAnnotateRevisions="500">
+    <option name="USER" value=""/>
+    <option name="PASSWORD" value=""/>
+    <option name="LAST_MERGED_REVISION"/>
+    <option name="UPDATE_RUN_STATUS" value="false"/>
+    <option name="MERGE_DRY_RUN" value="false"/>
+    <option name="MERGE_DIFF_USE_ANCESTRY" value="true"/>
+    <option name="UPDATE_LOCK_ON_DEMAND" value="false"/>
+    <option name="IGNORE_SPACES_IN_MERGE" value="false"/>
+    <option name="DETECT_NESTED_COPIES" value="true"/>
+    <option name="IGNORE_SPACES_IN_ANNOTATE" value="true"/>
+    <option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true"/>
+    <myIsUseDefaultProxy>false</myIsUseDefaultProxy>
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task"/>
+    <servers/>
+  </component>
+  <component name="VcsManagerConfiguration">
+    <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true"/>
+    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true"/>
+    <option name="PERFORM_UPDATE_IN_BACKGROUND" value="true"/>
+    <option name="PERFORM_COMMIT_IN_BACKGROUND" value="true"/>
+    <option name="PERFORM_EDIT_IN_BACKGROUND" value="true"/>
+    <option name="PERFORM_CHECKOUT_IN_BACKGROUND" value="true"/>
+    <option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true"/>
+    <option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false"/>
+    <option name="CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND" value="false"/>
+    <option name="ENABLE_BACKGROUND_PROCESSES" value="false"/>
+    <option name="CHANGED_ON_SERVER_INTERVAL" value="60"/>
+    <option name="FORCE_NON_EMPTY_COMMENT" value="false"/>
+    <option name="LAST_COMMIT_MESSAGE"/>
+    <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true"/>
+    <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false"/>
+    <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false"/>
+    <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false"/>
+    <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false"/>
+    <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8"/>
+    <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5"/>
+    <option name="ACTIVE_VCS_NAME"/>
+    <option name="UPDATE_GROUP_BY_PACKAGES" value="false"/>
+    <option name="UPDATE_GROUP_BY_CHANGELIST" value="false"/>
+    <option name="SHOW_FILE_HISTORY_AS_TREE" value="false"/>
+    <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6"/>
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager/>
+  </component>
+</project>

+ 36 - 0
assignments/a0/build.gradle

@@ -0,0 +1,36 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * This generated file contains a sample Java project to get you started.
+ * For more details take a look at the Java Quickstart chapter in the Gradle
+ * user guide available at https://docs.gradle.org/4.7/userguide/tutorial_java_projects.html
+ */
+
+plugins {
+    // Apply the java plugin to add support for Java
+    id 'java'
+
+    // Apply the application plugin to add support for building an application
+    id 'application'
+
+    // apply the plugin for IDEA cause restricting us to an IDE arbitrarily is great. not like we couldn't just submit JAR files
+    id 'idea'
+}
+
+// Define the main class for the application
+mainClassName = 'App'
+
+dependencies {
+    // This dependency is found on compile classpath of this component and consumers.
+    compile 'com.google.guava:guava:23.0'
+
+    // Use JUnit test framework
+    testCompile 'junit:junit:4.12'
+}
+
+// In this section you declare where to find the dependencies of your project
+repositories {
+    // Use jcenter for resolving your dependencies.
+    // You can declare any Maven/Ivy/file repository here.
+    jcenter()
+}

BIN
assignments/a0/build/classes/java/main/App.class


BIN
assignments/a0/build/classes/java/main/Hello.class


BIN
assignments/a0/build/classes/java/main/Main.class


BIN
assignments/a0/build/classes/java/test/AppTest.class


BIN
assignments/a0/build/distributions/a0.tar


BIN
assignments/a0/build/distributions/a0.zip


BIN
assignments/a0/build/libs/a0.jar


+ 96 - 0
assignments/a0/build/reports/tests/test/classes/AppTest.html

@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta http-equiv="x-ua-compatible" content="IE=edge"/>
+<title>Test results - Class AppTest</title>
+<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
+<link href="../css/style.css" rel="stylesheet" type="text/css"/>
+<script src="../js/report.js" type="text/javascript"></script>
+</head>
+<body>
+<div id="content">
+<h1>Class AppTest</h1>
+<div class="breadcrumbs">
+<a href="../index.html">all</a> &gt; 
+<a href="../packages/default-package.html">default-package</a> &gt; AppTest</div>
+<div id="summary">
+<table>
+<tr>
+<td>
+<div class="summaryGroup">
+<table>
+<tr>
+<td>
+<div class="infoBox" id="tests">
+<div class="counter">1</div>
+<p>tests</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="failures">
+<div class="counter">0</div>
+<p>failures</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="ignored">
+<div class="counter">0</div>
+<p>ignored</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="duration">
+<div class="counter">0s</div>
+<p>duration</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</td>
+<td>
+<div class="infoBox success" id="successRate">
+<div class="percent">100%</div>
+<p>successful</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div id="tabs">
+<ul class="tabLinks">
+<li>
+<a href="#tab0">Tests</a>
+</li>
+</ul>
+<div id="tab0" class="tab">
+<h2>Tests</h2>
+<table>
+<thead>
+<tr>
+<th>Test</th>
+<th>Duration</th>
+<th>Result</th>
+</tr>
+</thead>
+<tr>
+<td class="success">testAppHasAGreeting</td>
+<td class="success">0s</td>
+<td class="success">passed</td>
+</tr>
+</table>
+</div>
+</div>
+<div id="footer">
+<p>
+<div>
+<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
+<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
+</label>
+</div>Generated by 
+<a href="http://www.gradle.org">Gradle 4.7</a> at May 31, 2018, 1:09:06 PM</p>
+</div>
+</div>
+</body>
+</html>

+ 179 - 0
assignments/a0/build/reports/tests/test/css/base-style.css

@@ -0,0 +1,179 @@
+
+body {
+    margin: 0;
+    padding: 0;
+    font-family: sans-serif;
+    font-size: 12pt;
+}
+
+body, a, a:visited {
+    color: #303030;
+}
+
+#content {
+    padding-left: 50px;
+    padding-right: 50px;
+    padding-top: 30px;
+    padding-bottom: 30px;
+}
+
+#content h1 {
+    font-size: 160%;
+    margin-bottom: 10px;
+}
+
+#footer {
+    margin-top: 100px;
+    font-size: 80%;
+    white-space: nowrap;
+}
+
+#footer, #footer a {
+    color: #a0a0a0;
+}
+
+#line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+#label-for-line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+ul {
+    margin-left: 0;
+}
+
+h1, h2, h3 {
+    white-space: nowrap;
+}
+
+h2 {
+    font-size: 120%;
+}
+
+ul.tabLinks {
+    padding-left: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    overflow: auto;
+    min-width: 800px;
+    width: auto !important;
+    width: 800px;
+}
+
+ul.tabLinks li {
+    float: left;
+    height: 100%;
+    list-style: none;
+    padding-left: 10px;
+    padding-right: 10px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-bottom: 0;
+    -moz-border-radius: 7px;
+    border-radius: 7px;
+    margin-right: 25px;
+    border: solid 1px #d4d4d4;
+    background-color: #f0f0f0;
+}
+
+ul.tabLinks li:hover {
+    background-color: #fafafa;
+}
+
+ul.tabLinks li.selected {
+    background-color: #c5f0f5;
+    border-color: #c5f0f5;
+}
+
+ul.tabLinks a {
+    font-size: 120%;
+    display: block;
+    outline: none;
+    text-decoration: none;
+    margin: 0;
+    padding: 0;
+}
+
+ul.tabLinks li h2 {
+    margin: 0;
+    padding: 0;
+}
+
+div.tab {
+}
+
+div.selected {
+    display: block;
+}
+
+div.deselected {
+    display: none;
+}
+
+div.tab table {
+    min-width: 350px;
+    width: auto !important;
+    width: 350px;
+    border-collapse: collapse;
+}
+
+div.tab th, div.tab table {
+    border-bottom: solid #d0d0d0 1px;
+}
+
+div.tab th {
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 6em;
+}
+
+div.tab th:first-child {
+    padding-left: 0;
+}
+
+div.tab td {
+    white-space: nowrap;
+    padding-left: 6em;
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+div.tab td:first-child {
+    padding-left: 0;
+}
+
+div.tab td.numeric, div.tab th.numeric {
+    text-align: right;
+}
+
+span.code {
+    display: inline-block;
+    margin-top: 0em;
+    margin-bottom: 1em;
+}
+
+span.code pre {
+    font-size: 11pt;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0;
+    background-color: #f7f7f7;
+    border: solid 1px #d0d0d0;
+    min-width: 700px;
+    width: auto !important;
+    width: 700px;
+}
+
+span.wrapped pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+    word-break: break-all;
+}
+
+label.hidden {
+    display: none;
+}

+ 84 - 0
assignments/a0/build/reports/tests/test/css/style.css

@@ -0,0 +1,84 @@
+
+#summary {
+    margin-top: 30px;
+    margin-bottom: 40px;
+}
+
+#summary table {
+    border-collapse: collapse;
+}
+
+#summary td {
+    vertical-align: top;
+}
+
+.breadcrumbs, .breadcrumbs a {
+    color: #606060;
+}
+
+.infoBox {
+    width: 110px;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    text-align: center;
+}
+
+.infoBox p {
+    margin: 0;
+}
+
+.counter, .percent {
+    font-size: 120%;
+    font-weight: bold;
+    margin-bottom: 8px;
+}
+
+#duration {
+    width: 125px;
+}
+
+#successRate, .summaryGroup {
+    border: solid 2px #d0d0d0;
+    -moz-border-radius: 10px;
+    border-radius: 10px;
+}
+
+#successRate {
+    width: 140px;
+    margin-left: 35px;
+}
+
+#successRate .percent {
+    font-size: 180%;
+}
+
+.success, .success a {
+    color: #008000;
+}
+
+div.success, #successRate.success {
+    background-color: #bbd9bb;
+    border-color: #008000;
+}
+
+.failures, .failures a {
+    color: #b60808;
+}
+
+.skipped, .skipped a {
+    color: #c09853;
+}
+
+div.failures, #successRate.failures {
+    background-color: #ecdada;
+    border-color: #b60808;
+}
+
+ul.linkList {
+    padding-left: 0;
+}
+
+ul.linkList li {
+    list-style: none;
+    margin-bottom: 5px;
+}

+ 132 - 0
assignments/a0/build/reports/tests/test/index.html

@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta http-equiv="x-ua-compatible" content="IE=edge"/>
+<title>Test results - Test Summary</title>
+<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
+<link href="css/style.css" rel="stylesheet" type="text/css"/>
+<script src="js/report.js" type="text/javascript"></script>
+</head>
+<body>
+<div id="content">
+<h1>Test Summary</h1>
+<div id="summary">
+<table>
+<tr>
+<td>
+<div class="summaryGroup">
+<table>
+<tr>
+<td>
+<div class="infoBox" id="tests">
+<div class="counter">1</div>
+<p>tests</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="failures">
+<div class="counter">0</div>
+<p>failures</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="ignored">
+<div class="counter">0</div>
+<p>ignored</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="duration">
+<div class="counter">0s</div>
+<p>duration</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</td>
+<td>
+<div class="infoBox success" id="successRate">
+<div class="percent">100%</div>
+<p>successful</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div id="tabs">
+<ul class="tabLinks">
+<li>
+<a href="#tab0">Packages</a>
+</li>
+<li>
+<a href="#tab1">Classes</a>
+</li>
+</ul>
+<div id="tab0" class="tab">
+<h2>Packages</h2>
+<table>
+<thead>
+<tr>
+<th>Package</th>
+<th>Tests</th>
+<th>Failures</th>
+<th>Ignored</th>
+<th>Duration</th>
+<th>Success rate</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="success">
+<a href="packages/default-package.html">default-package</a>
+</td>
+<td>1</td>
+<td>0</td>
+<td>0</td>
+<td>0s</td>
+<td class="success">100%</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div id="tab1" class="tab">
+<h2>Classes</h2>
+<table>
+<thead>
+<tr>
+<th>Class</th>
+<th>Tests</th>
+<th>Failures</th>
+<th>Ignored</th>
+<th>Duration</th>
+<th>Success rate</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="success"/>
+<a href="classes/AppTest.html">AppTest</a>
+<td>1</td>
+<td>0</td>
+<td>0</td>
+<td>0s</td>
+<td class="success">100%</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div id="footer">
+<p>
+<div>
+<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
+<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
+</label>
+</div>Generated by 
+<a href="http://www.gradle.org">Gradle 4.7</a> at May 31, 2018, 1:09:06 PM</p>
+</div>
+</div>
+</body>
+</html>

+ 194 - 0
assignments/a0/build/reports/tests/test/js/report.js

@@ -0,0 +1,194 @@
+(function (window, document) {
+    "use strict";
+
+    var tabs = {};
+
+    function changeElementClass(element, classValue) {
+        if (element.getAttribute("className")) {
+            element.setAttribute("className", classValue);
+        } else {
+            element.setAttribute("class", classValue);
+        }
+    }
+
+    function getClassAttribute(element) {
+        if (element.getAttribute("className")) {
+            return element.getAttribute("className");
+        } else {
+            return element.getAttribute("class");
+        }
+    }
+
+    function addClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element) + " " + classValue);
+    }
+
+    function removeClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
+    }
+
+    function initTabs() {
+        var container = document.getElementById("tabs");
+
+        tabs.tabs = findTabs(container);
+        tabs.titles = findTitles(tabs.tabs);
+        tabs.headers = findHeaders(container);
+        tabs.select = select;
+        tabs.deselectAll = deselectAll;
+        tabs.select(0);
+
+        return true;
+    }
+
+    function getCheckBox() {
+        return document.getElementById("line-wrapping-toggle");
+    }
+
+    function getLabelForCheckBox() {
+        return document.getElementById("label-for-line-wrapping-toggle");
+    }
+
+    function findCodeBlocks() {
+        var spans = document.getElementById("tabs").getElementsByTagName("span");
+        var codeBlocks = [];
+        for (var i = 0; i < spans.length; ++i) {
+            if (spans[i].className.indexOf("code") >= 0) {
+                codeBlocks.push(spans[i]);
+            }
+        }
+        return codeBlocks;
+    }
+
+    function forAllCodeBlocks(operation) {
+        var codeBlocks = findCodeBlocks();
+
+        for (var i = 0; i < codeBlocks.length; ++i) {
+            operation(codeBlocks[i], "wrapped");
+        }
+    }
+
+    function toggleLineWrapping() {
+        var checkBox = getCheckBox();
+
+        if (checkBox.checked) {
+            forAllCodeBlocks(addClass);
+        } else {
+            forAllCodeBlocks(removeClass);
+        }
+    }
+
+    function initControls() {
+        if (findCodeBlocks().length > 0) {
+            var checkBox = getCheckBox();
+            var label = getLabelForCheckBox();
+
+            checkBox.onclick = toggleLineWrapping;
+            checkBox.checked = false;
+
+            removeClass(label, "hidden");
+         }
+    }
+
+    function switchTab() {
+        var id = this.id.substr(1);
+
+        for (var i = 0; i < tabs.tabs.length; i++) {
+            if (tabs.tabs[i].id === id) {
+                tabs.select(i);
+                break;
+            }
+        }
+
+        return false;
+    }
+
+    function select(i) {
+        this.deselectAll();
+
+        changeElementClass(this.tabs[i], "tab selected");
+        changeElementClass(this.headers[i], "selected");
+
+        while (this.headers[i].firstChild) {
+            this.headers[i].removeChild(this.headers[i].firstChild);
+        }
+
+        var h2 = document.createElement("H2");
+
+        h2.appendChild(document.createTextNode(this.titles[i]));
+        this.headers[i].appendChild(h2);
+    }
+
+    function deselectAll() {
+        for (var i = 0; i < this.tabs.length; i++) {
+            changeElementClass(this.tabs[i], "tab deselected");
+            changeElementClass(this.headers[i], "deselected");
+
+            while (this.headers[i].firstChild) {
+                this.headers[i].removeChild(this.headers[i].firstChild);
+            }
+
+            var a = document.createElement("A");
+
+            a.setAttribute("id", "ltab" + i);
+            a.setAttribute("href", "#tab" + i);
+            a.onclick = switchTab;
+            a.appendChild(document.createTextNode(this.titles[i]));
+
+            this.headers[i].appendChild(a);
+        }
+    }
+
+    function findTabs(container) {
+        return findChildElements(container, "DIV", "tab");
+    }
+
+    function findHeaders(container) {
+        var owner = findChildElements(container, "UL", "tabLinks");
+        return findChildElements(owner[0], "LI", null);
+    }
+
+    function findTitles(tabs) {
+        var titles = [];
+
+        for (var i = 0; i < tabs.length; i++) {
+            var tab = tabs[i];
+            var header = findChildElements(tab, "H2", null)[0];
+
+            header.parentNode.removeChild(header);
+
+            if (header.innerText) {
+                titles.push(header.innerText);
+            } else {
+                titles.push(header.textContent);
+            }
+        }
+
+        return titles;
+    }
+
+    function findChildElements(container, name, targetClass) {
+        var elements = [];
+        var children = container.childNodes;
+
+        for (var i = 0; i < children.length; i++) {
+            var child = children.item(i);
+
+            if (child.nodeType === 1 && child.nodeName === name) {
+                if (targetClass && child.className.indexOf(targetClass) < 0) {
+                    continue;
+                }
+
+                elements.push(child);
+            }
+        }
+
+        return elements;
+    }
+
+    // Entry point.
+
+    window.onload = function() {
+        initTabs();
+        initControls();
+    };
+} (window, window.document));

+ 103 - 0
assignments/a0/build/reports/tests/test/packages/default-package.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta http-equiv="x-ua-compatible" content="IE=edge"/>
+<title>Test results - Default package</title>
+<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
+<link href="../css/style.css" rel="stylesheet" type="text/css"/>
+<script src="../js/report.js" type="text/javascript"></script>
+</head>
+<body>
+<div id="content">
+<h1>Default package</h1>
+<div class="breadcrumbs">
+<a href="../index.html">all</a> &gt; default-package</div>
+<div id="summary">
+<table>
+<tr>
+<td>
+<div class="summaryGroup">
+<table>
+<tr>
+<td>
+<div class="infoBox" id="tests">
+<div class="counter">1</div>
+<p>tests</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="failures">
+<div class="counter">0</div>
+<p>failures</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="ignored">
+<div class="counter">0</div>
+<p>ignored</p>
+</div>
+</td>
+<td>
+<div class="infoBox" id="duration">
+<div class="counter">0s</div>
+<p>duration</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</td>
+<td>
+<div class="infoBox success" id="successRate">
+<div class="percent">100%</div>
+<p>successful</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div id="tabs">
+<ul class="tabLinks">
+<li>
+<a href="#tab0">Classes</a>
+</li>
+</ul>
+<div id="tab0" class="tab">
+<h2>Classes</h2>
+<table>
+<thread>
+<tr>
+<th>Class</th>
+<th>Tests</th>
+<th>Failures</th>
+<th>Ignored</th>
+<th>Duration</th>
+<th>Success rate</th>
+</tr>
+</thread>
+<tr>
+<td class="success">
+<a href="../classes/AppTest.html">AppTest</a>
+</td>
+<td>1</td>
+<td>0</td>
+<td>0</td>
+<td>0s</td>
+<td class="success">100%</td>
+</tr>
+</table>
+</div>
+</div>
+<div id="footer">
+<p>
+<div>
+<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
+<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
+</label>
+</div>Generated by 
+<a href="http://www.gradle.org">Gradle 4.7</a> at May 31, 2018, 1:09:06 PM</p>
+</div>
+</div>
+</body>
+</html>

+ 172 - 0
assignments/a0/build/scripts/a0

@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  a0 start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/.." >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="a0"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and A0_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/lib/a0.jar:$APP_HOME/lib/guava-23.0.jar:$APP_HOME/lib/jsr305-1.3.9.jar:$APP_HOME/lib/error_prone_annotations-2.0.18.jar:$APP_HOME/lib/j2objc-annotations-1.1.jar:$APP_HOME/lib/animal-sniffer-annotations-1.14.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $A0_OPTS -classpath "\"$CLASSPATH\"" App "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"

+ 84 - 0
assignments/a0/build/scripts/a0.bat

@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  a0 startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%..
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and A0_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\lib\a0.jar;%APP_HOME%\lib\guava-23.0.jar;%APP_HOME%\lib\jsr305-1.3.9.jar;%APP_HOME%\lib\error_prone_annotations-2.0.18.jar;%APP_HOME%\lib\j2objc-annotations-1.1.jar;%APP_HOME%\lib\animal-sniffer-annotations-1.14.jar
+
+@rem Execute a0
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %A0_OPTS%  -classpath "%CLASSPATH%" App %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable A0_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%A0_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 7 - 0
assignments/a0/build/test-results/test/TEST-AppTest.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="AppTest" tests="1" skipped="0" failures="0" errors="0" timestamp="2018-05-31T17:09:06" hostname="tdeb" time="0.0">
+  <properties/>
+  <testcase name="testAppHasAGreeting" classname="AppTest" time="0.0"/>
+  <system-out><![CDATA[]]></system-out>
+  <system-err><![CDATA[]]></system-err>
+</testsuite>

+ 0 - 0
assignments/a0/build/test-results/test/binary/output.bin


BIN
assignments/a0/build/test-results/test/binary/output.bin.idx


BIN
assignments/a0/build/test-results/test/binary/results.bin


+ 2 - 0
assignments/a0/build/tmp/jar/MANIFEST.MF

@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+

BIN
assignments/a0/gradle/wrapper/gradle-wrapper.jar


+ 5 - 0
assignments/a0/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

+ 172 - 0
assignments/a0/gradlew

@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"

+ 84 - 0
assignments/a0/gradlew.bat

@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 10 - 0
assignments/a0/settings.gradle

@@ -0,0 +1,10 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * 
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/4.7/userguide/multi_project_builds.html
+ */
+
+rootProject.name = 'a0'

+ 12 - 0
assignments/a0/src/main/java/App.java

@@ -0,0 +1,12 @@
+/*
+ * This Java source file was generated by the Gradle 'init' task.
+ */
+public class App {
+    public String getGreeting() {
+        return "Hello world.";
+    }
+
+    public static void main(String[] args) {
+        System.out.println(new App().getGreeting());
+    }
+}

+ 12 - 0
assignments/a0/src/test/java/AppTest.java

@@ -0,0 +1,12 @@
+/*
+ * This Java source file was generated by the Gradle 'init' task.
+ */
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class AppTest {
+    @Test public void testAppHasAGreeting() {
+        App classUnderTest = new App();
+        assertNotNull("app should have a greeting", classUnderTest.getGreeting());
+    }
+}

+ 19 - 0
assignments/a1/Makefile

@@ -0,0 +1,19 @@
+# super simple makefile
+# call it using 'make NAME=name_of_code_file_without_extension'
+# (assumes a .cpp extension)
+NAME = snake
+
+#
+# Add $(MAC_OPT) to the compile line for Mac OSX.
+MAC_OPT = "-I/opt/X11/include"
+
+all:
+	@echo "Compiling..."
+	g++ -o $(NAME) $(NAME).cc -L/opt/X11/lib -lX11 -lstdc++ $(MAC_OPT)
+
+run: all
+	@echo "Running..."
+	./$(NAME) 
+
+clean:
+	rm ./snake

BIN
assignments/a1/snake


+ 693 - 0
assignments/a1/snake.cc

@@ -0,0 +1,693 @@
+/*
+CS 349 A1 Skeleton Code - Snake
+
+- - - - - - - - - - - - - - - - - - - - - -
+
+Commands to compile and run:
+
+    g++ -o snake snake.cpp -L/usr/X11R6/lib -lX11 -lstdc++
+    ./snake
+
+Note: the -L option and -lstdc++ may not be needed on some machines.
+*/
+
+#include <iostream>
+#include <list>
+#include <vector>
+#include <cstdlib>
+#include <sys/time.h>
+#include <math.h>
+#include <stdio.h>
+#include <unistd.h>
+
+/*
+ * Header files for X functions
+ */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+using namespace std;
+
+// Globals for xlib
+Colormap colours;
+XColor xcolour;
+char black[] = "rgb:00/00/00";
+char white[] = "rgb:ff/ff/ff";
+char lblue[] = "rgb:00/ff/ff";
+char orange[] = "rgb:FF/45/00";
+
+/*
+ * Global game state variables
+ */
+const int Border = 1;
+const int BufferSize = 10;
+int FPS = 30;
+const int width = 800;
+const int height = 600;
+const int blockSize = 25;
+int velocity = 5;
+bool paused = true;
+bool starting = true;
+
+/*
+ * Information to draw on the window.
+ */
+typedef struct XInfo
+{
+	Display	* display;
+	int screen;
+	Window window;
+	GC gc[3];
+	int width;		// size of window
+	int height;
+  Pixmap buffer;
+} Xinfo;
+
+
+// get microseconds
+unsigned long now()
+{
+	timeval tv;
+	gettimeofday(&tv, NULL);
+	return tv.tv_sec * 1000000 + tv.tv_usec;
+}
+
+/*
+ * Function to put out a message on error exits.
+ */
+void error(string str)
+{
+  cerr << str << endl;
+  exit(0);
+}
+
+// change the drawing coloursvoid changecolour(char colour[])
+void changecolour(XInfo & xinfo, char colour[])
+{
+  XParseColor(xinfo.display, colours, colour, &xcolour);
+  XAllocColor(xinfo.display, colours, &xcolour);
+  XSetForeground(xinfo.display, xinfo.gc[0], xcolour.pixel);
+  XFreeColormap(xinfo.display, colours);
+}
+
+/*
+ * An abstract class representing displayable things.
+ */
+class Displayable
+{
+	public:
+		virtual void paint(XInfo & xinfo) = 0;
+};
+
+class Fruit : public Displayable
+{
+	public:
+		virtual void paint(XInfo & xinfo)
+    {
+      changecolour(xinfo, orange);
+			XFillArc(xinfo.display, xinfo.buffer, xinfo.gc[0], x, y, 25, 25, 0, 360 * 64);
+    }
+
+    Fruit()
+    {
+      newspot();
+    }
+
+    int getx()
+    {
+      return x;
+    }
+
+    int gety()
+    {
+      return y;
+    }
+
+    void newspot()
+    {
+      x = (rand() % 32) * 25;
+      y = (rand() % 24) * 25;
+    }
+        // ** ADD YOUR LOGIC **
+        /*
+         * The fruit needs to be re-generated at new location every time a snake eats it. See the assignment webpage for more details.
+         */
+
+    private:
+        int x;
+        int y;
+};
+
+class Section: public Displayable
+{
+	public:
+		virtual void paint(XInfo & xinfo)
+    {
+      changecolour(xinfo, black);
+      switch(direction)
+      {
+        case 1:
+          XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], x, y, blockSize, (len + 1) * blockSize);
+          break;
+
+        case 2:
+          XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], (x - len * blockSize), y, (1 + len) * blockSize, blockSize);
+          break;
+
+        case 3:
+          XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], x, (y - len * blockSize), blockSize, ((1 + len) * blockSize));
+          break;
+
+        case 4:
+          XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], x, y, (len + 1) * blockSize, blockSize);
+          break;
+      }
+		}
+
+    void increment(int x)
+    {
+      len += x;
+    }
+
+    void decrement()
+    {
+      --len;
+    }
+
+		bool empty()
+    {
+      return (!len);
+    }
+
+    void grow()
+    {
+      switch(direction)
+      {
+        case 1:
+          y -= blockSize;
+          break;
+
+        case 2:
+          x += blockSize;
+          break;
+
+        case 3:
+          y += blockSize;
+          break;
+
+        case 4:
+          x -= blockSize;
+          break;
+      }
+
+      ++len;
+    }
+
+    int getx()
+    {
+      return x;
+    }
+
+    int gety()
+    {
+      return y;
+    }
+
+    int getdir()
+    {
+      return direction;
+    }
+
+    int getlen()
+    {
+      return len;
+    }
+
+		Section(int x, int y, int dir, int len = 1): x(x), y(y), direction(dir), len(len)
+    {
+      blockSize = 25;
+		}
+
+	private:
+		int x;
+    int y;
+    int len;
+		int blockSize;
+		int direction;
+};
+
+class Snake : public Displayable
+{
+	public:
+		virtual void paint(XInfo & xinfo)
+    {
+      for (Section * each: sections)
+      {
+        each->paint(xinfo);
+      }
+
+		}
+
+		void move(XInfo & xinfo)
+    {
+      if ((now() - lastmove < speed) || paused)
+      {
+        return;
+      }
+      // turn if a turn happens
+      if (direction)
+      {
+        Section * newsec = new Section(sections.front()->getx(), sections.front()->gety(), direction, 0);
+        direction = 0;
+        sections.insert(sections.begin(), newsec);
+      }
+
+      // move 1 block forwards
+      sections.front()->grow();
+
+      // see if fruit was eaten
+      if (sections.front()->getx() == fruity->getx() && sections.front()->gety() == fruity->gety())
+      {
+        fruit = 1;
+      }
+
+      // add fruit, remove 1 from end, delete if empty
+      sections.back()->increment(fruit);
+      if (fruit) fruity->newspot();
+      fruit = 0;
+      sections.back()->decrement();
+      if (sections.back()->empty())
+      {
+        delete sections.back();
+        sections.pop_back();
+      }
+
+      if (sections.front()->getx() > width || sections.front()->gety() < 0)
+      {
+        printf("you're shit\n");
+        delete this;
+        exit(0);
+      }
+
+      if (sections.front()->getx() < 0 || sections.front()->gety() > height)
+      {
+        printf("you're shit\n");
+        delete this;
+        exit(0);
+      }
+
+      if (sections.size() <= 3) goto SKIP;
+      for (auto each = sections.begin() + 1; each != sections.end(); ++each)
+      {
+        int tempdir = (*each)->getdir();
+        int frontx = sections.front()->getx();
+        int fronty = sections.front()->gety();
+        int eachx = (*each)->getx();
+        int eachy = (*each)->gety();
+        int eachlen = (*each)->getlen();
+
+        switch(tempdir)
+        {
+          case 1:
+            if (frontx == eachx && (fronty >= eachy && fronty <= (eachy + blockSize * eachlen)))
+            {
+              printf("you're shit\n");
+              delete this;
+              exit(0);
+            }
+            break;
+
+          case 2:
+            if ((frontx >= (eachx - eachlen * blockSize) && frontx <= eachx) && fronty == eachy)
+            {
+              printf("you're shit\n");
+              delete this;
+              exit(0);
+            }
+            break;
+
+          case 3:
+            if (frontx == eachx && (fronty <= eachy && fronty >= (eachy - blockSize * eachlen)))
+            {
+              printf("you're shit\n");
+              delete this;
+              exit(0);
+            }
+            break;
+
+          case 4:
+            if ((frontx <= (eachx - eachlen * blockSize) && frontx >= eachx) && fronty == eachy)
+            {
+              printf("you're shit\n");
+              delete this;
+              exit(0);
+            }
+            break;
+        }
+      }
+
+      SKIP:
+      lastmove = now();
+		}
+
+    void moveup()
+    {
+      if (direction == 4 || direction == 2 || direction == 0) direction = 1;
+    }
+
+    void moveright()
+    {
+      if (direction == 1 || direction == 3 || direction == 0) direction = 2;
+    }
+
+    void movedown()
+    {
+      if (direction == 4 || direction == 2 || direction == 0) direction = 3;
+    }
+
+    void moveleft()
+    {
+      if (direction == 1 || direction == 3 || direction == 0) direction = 4;
+    }
+
+    void changespeed(unsigned long x)
+    {
+      speed = 250000 / x;
+    }
+
+    void reset(int fast)
+    {
+      int size = sections.size();
+
+      for (int i = 0; i < size; i++)
+      {
+        delete sections.at(i);
+        sections.erase(sections.begin() + i);
+      }
+
+      Section * newsec = new Section(x, y, 2, 2);
+      sections.insert(sections.begin(), newsec);
+      direction = 0;
+      blockSize = 25;
+      speed = 250000 / fast;
+      lastmove = 0;
+    }
+
+		Snake(int x, int y, Fruit * fruity, unsigned long fast): x(x), y(y), fruity(fruity)
+    {
+      Section * newsec = new Section(x, y, 2, 2);
+      sections.insert(sections.begin(), newsec);
+      direction = 0;
+      blockSize = 25;
+      speed = 250000 / fast;
+      lastmove = 0;
+		}
+
+    ~Snake()
+    {
+      int size = sections.size();
+
+      for (int i = 0; i < size; i++)
+      {
+        delete sections.at(i);
+        sections.erase(sections.begin() + i);
+      }
+    }
+
+	private:
+		int x;
+		int y;
+    vector<Section *> sections;
+		int blockSize;
+		int direction;
+    unsigned long speed;
+    int fruit;
+    Fruit * fruity;
+    unsigned long lastmove;
+};
+
+list<Displayable *> dList;           // list of Displayables
+Fruit fruity;
+Snake snake(100, 450, &fruity, velocity);
+
+/*
+ * Initialize X and create a window
+ */
+void initX(int argc, char * argv[], XInfo & xInfo)
+{
+	XSizeHints hints;
+	unsigned long white, black;
+
+   /*
+	* Display opening uses the DISPLAY	environment variable.
+	* It can go wrong if DISPLAY isn't set, or you don't have permission.
+	*/
+	xInfo.display = XOpenDisplay("");
+	if (!xInfo.display)
+  {
+		error("Can't open display.");
+	}
+
+   /*
+	* Find out some things about the display you're using.
+	*/
+	xInfo.screen = DefaultScreen(xInfo.display);
+
+  colours = DefaultColormap(xInfo.display, xInfo.screen);
+	white = XWhitePixel(xInfo.display, xInfo.screen);
+	black = XBlackPixel(xInfo.display, xInfo.screen);
+
+	hints.x = 100;
+	hints.y = 100;
+	hints.width = 800;
+	hints.height = 600;
+	hints.flags = PPosition | PSize;
+
+	xInfo.window = XCreateSimpleWindow
+  (
+		xInfo.display,				// display where window appears
+		DefaultRootWindow( xInfo.display ), // window's parent in window tree
+		hints.x, hints.y,			// upper left corner location
+		hints.width, hints.height,	// size of the window
+		Border,						// width of window's border
+		black,						// window border colour
+		white
+  );					// window background colour
+
+	XSetStandardProperties
+  (
+		xInfo.display,		// display containing the window
+		xInfo.window,		// window whose properties are set
+		"animation",		// window's title
+		"Animate",			// icon's title
+		None,				// pixmap for the icon
+		argv, argc,			// applications command line args
+		&hints
+  );			// size hints for the window
+
+  int depth = DefaultDepth(xInfo.display, DefaultScreen(xInfo.display));
+  xInfo.buffer = XCreatePixmap(xInfo.display, xInfo.window, hints.width, hints.height, depth);
+	/*
+	 * Create Graphics Contexts
+	 */
+	int i = 0;
+	xInfo.gc[i] = XCreateGC(xInfo.display, xInfo.window, 0, 0);
+  XSetBackground(xInfo.display, xInfo.gc[0], WhitePixel(xInfo.display, xInfo.screen));
+	XSetFillStyle(xInfo.display, xInfo.gc[i], FillSolid);
+	XSetLineAttributes(xInfo.display, xInfo.gc[i],
+	                     1, LineSolid, CapButt, JoinRound);
+
+	XSelectInput(xInfo.display, xInfo.window,
+		ButtonPressMask | KeyPressMask |
+		PointerMotionMask |
+		EnterWindowMask | LeaveWindowMask);  // for resize events
+
+	/*
+	 * Put the window on the screen.
+	 */
+	XMapRaised( xInfo.display, xInfo.window );
+	XFlush(xInfo.display);
+}
+
+void splash(XInfo & xinfo)
+{
+  //char * title = {'S', 'n', 'a', 'k', 'e', '\0'};
+  changecolour(xinfo, white);
+  XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], 100, 100, 600, 400);
+  changecolour(xinfo, black);
+  XFontStruct * font = XLoadQueryFont(xinfo.display, "12x24");
+  XSetFont(xinfo.display, xinfo.gc[0], font->fid);
+  XDrawString(xinfo.display, xinfo.buffer, xinfo.gc[0], 350, 200, "Snake", 5);
+  XDrawString(xinfo.display, xinfo.buffer, xinfo.gc[0], 340, 240, "tsdedhar", 8);
+  XDrawString(xinfo.display, xinfo.buffer, xinfo.gc[0], 340, 280, "20621325", 8);
+  XDrawString(xinfo.display, xinfo.buffer, xinfo.gc[0], 265, 320, "Use arrow keys to turn", 22);
+  XDrawString(xinfo.display, xinfo.buffer, xinfo.gc[0], 200, 360, "Collect fruit to grow your snake", 32);
+}
+/*
+ * Function to repaint a display list
+ */
+void repaint(XInfo & xinfo)
+{
+	list<Displayable *>::const_iterator begin = dList.begin();
+	list<Displayable *>::const_iterator end = dList.end();
+
+	// get height and width of window (might have changed since last repaint)
+  XWindowAttributes windowInfo;
+	XGetWindowAttributes(xinfo.display, xinfo.window, &windowInfo);
+  unsigned int height = windowInfo.height;
+	unsigned int width = windowInfo.width;
+  changecolour(xinfo, lblue);
+  XFillRectangle(xinfo.display, xinfo.buffer, xinfo.gc[0], 0, 0, width, height);
+  changecolour(xinfo, black);
+
+	// draw display list
+	while (begin != end)
+  {
+		Displayable * d = *begin;
+		d->paint(xinfo);
+		begin++;
+	}
+
+  if (starting) splash(xinfo);
+}
+
+void handleKeyPress(XInfo & xinfo, XEvent & event)
+{
+	KeySym key;
+	char text[BufferSize];
+	int i = XLookupString
+  (
+		(XKeyEvent *)&event, 	// the keyboard event
+		text, 					// buffer when text will be written
+		BufferSize, 			// size of the text buffer
+		&key, 					// workstation-independent key symbol
+		NULL
+  );
+
+	if (i == 1)
+  {
+		printf("Got key press -- %c\n", text[0]);
+
+    switch(text[0])
+    {
+      case 'q':
+        error("Terminating normally.");
+        break;
+
+      case ' ':
+        paused = !paused;
+        starting = false;
+        break;
+
+      case 'r':
+        snake.reset(velocity);
+        paused = true;
+        starting = true;
+        break;
+    }
+	}
+
+  if (key == XK_Up)
+  {
+    snake.moveup();
+  }
+
+  if (key == XK_Right)
+  {
+    snake.moveright();
+  }
+
+  if (key == XK_Down)
+  {
+    snake.movedown();
+  }
+
+  if (key == XK_Left)
+  {
+    snake.moveleft();
+  }
+}
+
+void handleAnimation(XInfo & xinfo, int inside)
+{
+	snake.move(xinfo);
+}
+
+void eventLoop(XInfo & xinfo)
+{
+	// Add stuff to paint to the display list
+	dList.push_front(&snake);
+  dList.push_front(&fruity);
+	XEvent event;
+  unsigned long lastRepaint = 0;
+  int inside = 0;
+  XWindowAttributes w;
+  XGetWindowAttributes(xinfo.display, xinfo.window, &w);
+
+  while(1)
+  {
+    if (XPending(xinfo.display) > 0)
+    {
+      XNextEvent(xinfo.display, &event);
+
+      switch(event.type)
+      {
+        case KeyPress:
+          handleKeyPress(xinfo, event);
+          break;
+        case EnterNotify:
+          inside = 1;
+          break;
+        case LeaveNotify:
+          inside = 0;
+          break;
+      }
+    }
+
+    unsigned long end = now();
+
+    if (end - lastRepaint > 1000000 / FPS)
+    {
+      handleAnimation(xinfo, inside);
+      repaint(xinfo);
+      XCopyArea(xinfo.display, xinfo.buffer, xinfo.window, xinfo.gc[0], 0, 0 , w.width, w.height, 0, 0);
+      XFlush(xinfo.display);
+      lastRepaint = now();
+    }
+
+    if (XPending(xinfo.display) == 0)
+    {
+      usleep(1000000 / FPS - (end - lastRepaint));
+    }
+  }
+}
+
+
+/*
+ * Start executing here.
+ *	 First initialize window.
+ *	 Next loop responding to events.
+ *	 Exit forcing window manager to clean up - cheesy, but easy.
+ */
+int main (int argc, char * argv[])
+{
+  if (argc == 1)
+  {
+  }
+  else if (argc == 3)
+  {
+    FPS = atoi(argv[1]);
+    velocity = atoi(argv[2]);
+  }
+  else
+  {
+    printf("you're shit\n");
+    exit(0);
+  }
+
+  snake.changespeed(velocity);
+	XInfo xInfo;
+	initX(argc, argv, xInfo);
+	eventLoop(xInfo);
+	XCloseDisplay(xInfo.display);
+}