From f523b62520ed80a78cab0ccd35a84a9d9ef299be Mon Sep 17 00:00:00 2001
From: Eilert Tunheim <emtunhei@stud.ntnu.no>
Date: Mon, 2 May 2022 14:22:39 +0200
Subject: [PATCH] Added check for max 10 characters in input field, for sql
 injection security, not printing error message to user yet tho

---
 .../java/com/application/DB/Constants.java    |  18 --
 src/main/java/com/application/DB/DB.java      |  68 +++---
 .../com/application/DB/HelpingFunctions.java  |  32 ++-
 .../com/application/GUI/InputPopUpWindow.java | 213 +++++++-----------
 .../application/GUI/OutputPopUpWindow.java    |   5 +-
 src/main/java/com/application/Main.java       |  15 +-
 .../com/application/DB/Constants.class        | Bin 6924 -> 6367 bytes
 target/classes/com/application/DB/DB.class    | Bin 16414 -> 16295 bytes
 .../com/application/DB/HelpingFunctions.class | Bin 7006 -> 8556 bytes
 .../application/GUI/InputPopUpWindow.class    | Bin 8009 -> 8416 bytes
 .../application/GUI/OutputPopUpWindow.class   | Bin 4658 -> 4699 bytes
 .../com/application/Main$1WorkerThread.class  | Bin 2263 -> 2269 bytes
 target/classes/com/application/Main.class     | Bin 8214 -> 8558 bytes
 13 files changed, 165 insertions(+), 186 deletions(-)

diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java
index 541ec59..fffe178 100644
--- a/src/main/java/com/application/DB/Constants.java
+++ b/src/main/java/com/application/DB/Constants.java
@@ -1,8 +1,5 @@
 package com.application.DB;
 
-import javafx.beans.property.SimpleIntegerProperty;
-import javafx.beans.value.ObservableValue;
-
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -21,18 +18,6 @@ public final class Constants {
     // Today's date
     public static final String CURRENT_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
 
-    // Start- & end time
-    public static String START_TIME = "";
-    public static String STOP_TIME = "";
-
-    // Boolean variable to tell if the drying process is finished
-    public static boolean IS_FINISHED = false;
-
-    // User inputs
-    public static String TREE_SPECIES = "";
-    public static String DIMENSIONS = "";
-    public static String SAWSET = "";
-    public static String MOISTURE_GOAL = "";
     public static String TIME_LEFT = "";
 
     // Number of manual moisture checks
@@ -47,9 +32,6 @@ public final class Constants {
     // Non linear regression
     public static final double ADJUST_REGRESSION = 5.5;
 
-    // Number percentage to display the searching for data
-    public static ObservableValue<Integer> PERCENTAGE = new SimpleIntegerProperty().asObject();
-
     // Current sawmill settings;
     public static final String PROJECT_ID = "sf-drying-optimization";
     public static final int LOCATION_ID = 124;
diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java
index 95044b7..614228a 100644
--- a/src/main/java/com/application/DB/DB.java
+++ b/src/main/java/com/application/DB/DB.java
@@ -6,6 +6,7 @@ import org.joda.time.DateTime;
 import java.util.*;
 
 import static com.application.DB.Constants.*;
+import static com.application.DB.HelpingFunctions.getNoOfChambers;
 
 /**
  * This class is responsible for handling database related activities
@@ -25,7 +26,8 @@ public class DB {
         //getKwh();
         //getName();
         //getZeroPointDate();
-        System.out.println(setInputParameters());
+        //System.out.println(setInputParameters());
+        getNoOfChambers();
 
     }
 
@@ -70,6 +72,9 @@ public class DB {
         String valueIDName;
         int valueID;
 
+        getNoOfChambers();
+        int chamberNo = 1;
+
 
         while(true){
 
@@ -91,16 +96,16 @@ public class DB {
 
                 if (location.getKey() == 124) {
                     // If location is Valasen, then the database stores furu as fura, swedish.
-                    if (TREE_SPECIES.equalsIgnoreCase("Furu")) {
-                        TREE_SPECIES = "Fura";
+                    if (HelpingFunctions.TREE_SPECIES.equalsIgnoreCase("Furu")) {
+                        HelpingFunctions.TREE_SPECIES = "Fura";
                     }
                     locationTables = getValasenTableNames();
                     valmeticsChamberIDS = getValasenValmeticsChamberIDS();
                     kwhChamberIDS = getValasenKwhChamberIDS();
                 }
                 if (location.getKey() == 174) {
-                    if (TREE_SPECIES.equalsIgnoreCase("Fura")) {
-                        TREE_SPECIES = "Furu";
+                    if (HelpingFunctions.TREE_SPECIES.equalsIgnoreCase("Fura")) {
+                        HelpingFunctions.TREE_SPECIES = "Furu";
                     }
                     locationTables = getArjangTableNames();
                     valmeticsChamberIDS = getArjangValmeticsChamberIDS();
@@ -124,33 +129,33 @@ public class DB {
                 //valueID = Integer.parseInt(location.getValue().get(locationTables.get("Kwh")).get("ValueID"));
 
 
-                System.out.printf("Tree species: \t%s\n", TREE_SPECIES);
-                System.out.printf("Width: \t\t\t%s\n", DIMENSIONS);
-                System.out.printf("Sawset: \t\t%s\n", SAWSET);
-                System.out.printf("Moisture: \t\t%s\n", MOISTURE_GOAL);
+                System.out.printf("Tree species: \t%s\n", HelpingFunctions.TREE_SPECIES);
+                System.out.printf("Width: \t\t\t%s\n", HelpingFunctions.DIMENSIONS);
+                System.out.printf("Sawset: \t\t%s\n", HelpingFunctions.SAWSET);
+                System.out.printf("Moisture: \t\t%s\n", HelpingFunctions.MOISTURE_GOAL);
 
 
                 // Defining the extra sql statements for extra parameters
-                treeSpecies = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + TREE_SPECIES + "%" + '"' + ") ";
-                dimensions = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + DIMENSIONS + "%" + '"' + ") ";
-                sawset = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + SAWSET + "%" + '"' + ") ";
-                moistureGoal = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + MOISTURE_GOAL + "\\\\%" + "%" + '"' + ") ";
+                treeSpecies = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.TREE_SPECIES + "%" + '"' + ") ";
+                dimensions = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.DIMENSIONS + "%" + '"' + ") ";
+                sawset = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.SAWSET + "%" + '"' + ") ";
+                moistureGoal = "AND LOWER(" + nameParameter + ") LIKE LOWER(" + '"' + "%" + HelpingFunctions.MOISTURE_GOAL + "\\\\%" + "%" + '"' + ") ";
 
 
                 // 1. Checking if user input is empty.
                 // 2. Checking if the extraInputParameter variable already contains the extra parameters,
                 //    if so not adding a second time.
                 // 3. Checking if the while loop have previously removed the parameter, if so, not adding again.
-                if (!TREE_SPECIES.isEmpty() && !extraInputParameter.contains(treeSpecies) && !treespeciesRemoved) {
+                if (!HelpingFunctions.TREE_SPECIES.isEmpty() && !extraInputParameter.contains(treeSpecies) && !treespeciesRemoved) {
                     extraInputParameter += treeSpecies;
                 }
-                if (!DIMENSIONS.isEmpty() && !extraInputParameter.contains(dimensions) && !dimensionsRemoved) {
+                if (!HelpingFunctions.DIMENSIONS.isEmpty() && !extraInputParameter.contains(dimensions) && !dimensionsRemoved) {
                     extraInputParameter += dimensions;
                 }
-                if (!SAWSET.isEmpty() && !extraInputParameter.contains(sawset) && !sawsetRemoved) {
+                if (!HelpingFunctions.SAWSET.isEmpty() && !extraInputParameter.contains(sawset) && !sawsetRemoved) {
                     extraInputParameter += sawset;
                 }
-                if (!MOISTURE_GOAL.isEmpty() && !extraInputParameter.contains(moistureGoal) && !moistureRemoved) {
+                if (!HelpingFunctions.MOISTURE_GOAL.isEmpty() && !extraInputParameter.contains(moistureGoal) && !moistureRemoved) {
                     extraInputParameter += moistureGoal;
                 }
 
@@ -172,6 +177,7 @@ public class DB {
                     System.out.printf("valueID: \t%d\n",valueID);
 
                 //System.out.println("Før results");
+
                 Map<Integer, Map<String, Number>> results = new TreeMap<>(getKwh(getZeroPointDate(locationID, extraInputParameter, nameParameter, kilinName, kilinID, startDryingTime, stopDryingTime, valmeticsTableName, limit),
                         locationID, kwhTableName, KwhName, timestamp, valueIDName, valueID, index));
 
@@ -570,29 +576,29 @@ public class DB {
         String moistureGoal;
 
         // Checks if variables is not null, if so, formats correctly for the sql statement
-        if(!START_TIME.equals("")){
-            startTime = '"'+START_TIME+'"';
+        if(!HelpingFunctions.START_TIME.equals("")){
+            startTime = '"'+ HelpingFunctions.START_TIME+'"';
         }
-        if(STOP_TIME != null){
-            stopTime = '"'+STOP_TIME+'"';
+        if(HelpingFunctions.STOP_TIME != null){
+            stopTime = '"'+ HelpingFunctions.STOP_TIME+'"';
         }
-        if(!TREE_SPECIES.equals("")){
-            treeSpecies = '"'+TREE_SPECIES+'"';
+        if(!HelpingFunctions.TREE_SPECIES.equals("")){
+            treeSpecies = '"'+ HelpingFunctions.TREE_SPECIES+'"';
         } else {
             treeSpecies = null;
         }
-        if(!DIMENSIONS.equals("")){
-            dimensions = '"'+DIMENSIONS+'"';
+        if(!HelpingFunctions.DIMENSIONS.equals("")){
+            dimensions = '"'+ HelpingFunctions.DIMENSIONS+'"';
         } else {
             dimensions = null;
         }
-        if(!SAWSET.equals("")){
-            sawset = '"'+SAWSET+'"';
+        if(!HelpingFunctions.SAWSET.equals("")){
+            sawset = '"'+ HelpingFunctions.SAWSET+'"';
         } else {
             sawset = null;
         }
-        if(!MOISTURE_GOAL.equals("")){
-            moistureGoal = '"'+MOISTURE_GOAL+'"';
+        if(!HelpingFunctions.MOISTURE_GOAL.equals("")){
+            moistureGoal = '"'+ HelpingFunctions.MOISTURE_GOAL+'"';
         } else {
             moistureGoal = null;
         }
@@ -623,8 +629,8 @@ public class DB {
         // Sqlstatement
         final String sqlStatement = "SELECT `" + KWH_TIMESTAMP_NAME_PARAMETER + "`, `" + KWH_NAME_PARAMETER + "` " +
                 "FROM `" + PROJECT_ID + "." + LOCATION_ID + "." + KWH_TABLE_NAME + "` " +
-                "WHERE " + KWH_TIMESTAMP_NAME_PARAMETER + " BETWEEN " + '"' + START_TIME + '"' +
-                " AND " + '"' + STOP_TIME + '"' +
+                "WHERE " + KWH_TIMESTAMP_NAME_PARAMETER + " BETWEEN " + '"' + HelpingFunctions.START_TIME + '"' +
+                " AND " + '"' + HelpingFunctions.STOP_TIME + '"' +
                 " AND " + KWH_VALUE_ID_NAME_PARAMETER + " = " + KWH_VALUE_ID_VALUE_PARAMETER + " " +
                 " AND " + KWH_NAME_PARAMETER + " <> 0 " +
                 " ORDER BY " + KWH_TIMESTAMP_NAME_PARAMETER + " ASC";
diff --git a/src/main/java/com/application/DB/HelpingFunctions.java b/src/main/java/com/application/DB/HelpingFunctions.java
index a34f4f5..e5689d4 100644
--- a/src/main/java/com/application/DB/HelpingFunctions.java
+++ b/src/main/java/com/application/DB/HelpingFunctions.java
@@ -11,11 +11,21 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.TimeZone;
 
-import static com.application.DB.Constants.PROJECT_ID;
+import static com.application.DB.Constants.*;
 
 public class HelpingFunctions {
 
 
+    // Start- & end time
+    public static String START_TIME = "";
+    public static String STOP_TIME = "";
+    // Boolean variable to tell if the drying process is finished
+    public static boolean IS_FINISHED = false;
+    // User inputs
+    public static String TREE_SPECIES = "";
+    public static String DIMENSIONS = "";
+    public static String SAWSET = "";
+    public static String MOISTURE_GOAL = "";
     static Map<String,String> manMoist = new HashMap<>();
 
     /**
@@ -149,4 +159,24 @@ public class HelpingFunctions {
             }
         }
     }
+
+    public static int getNoOfChambers(){
+        int valmeticsChamberIDS = 0;
+        int kwhChamberIDS = 0;
+        int noOfChambers = 0;
+        System.out.println("Constants.getSawmills().size(): "+Constants.getSawmills().size());
+        for (HashMap.Entry<Integer, HashMap<String, HashMap<String, String>>> first : Constants.getSawmills().entrySet()) {
+            if (first.getKey() == 124) {
+                valmeticsChamberIDS = getValasenValmeticsChamberIDS().size();
+                kwhChamberIDS = getValasenKwhChamberIDS().size();
+            }
+            if (first.getKey() == 174) {
+                valmeticsChamberIDS = getArjangValmeticsChamberIDS().size();
+                kwhChamberIDS = getArjangKwhChamberIDS().size();
+            }
+            noOfChambers+= Math.min(valmeticsChamberIDS, kwhChamberIDS);
+            System.out.println("NO_OF_CHAMBERS: "+noOfChambers);
+        }
+        return noOfChambers;
+    }
 }
diff --git a/src/main/java/com/application/GUI/InputPopUpWindow.java b/src/main/java/com/application/GUI/InputPopUpWindow.java
index 3043841..e4a829f 100644
--- a/src/main/java/com/application/GUI/InputPopUpWindow.java
+++ b/src/main/java/com/application/GUI/InputPopUpWindow.java
@@ -1,5 +1,6 @@
 package com.application.GUI;
 
+import com.application.DB.HelpingFunctions;
 import javafx.application.Platform;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
@@ -29,6 +30,8 @@ import static com.application.GUI.LineChartFunctionality.loadSingleSeries;
  */
 public class InputPopUpWindow {
 
+    private static boolean err = false;
+
     public static void exitDataThread(){
         Platform.exit();
         System.exit(0);
@@ -91,7 +94,7 @@ public class InputPopUpWindow {
                             "4ex"
         );
         ComboBox<String> sawsetList = new ComboBox<>(sawset);
-        sawsetList.setPromptText("Select Dimensions");
+        sawsetList.setPromptText("Select Sawset");
         sawsetList.setId("inputDropDownBox");
         sawsetList.setEditable(true);
 
@@ -107,7 +110,7 @@ public class InputPopUpWindow {
                         "20%"
         );
         ComboBox<String> moistureList = new ComboBox<>(moistureGoal);
-        moistureList.setPromptText("Select Dimensions");
+        moistureList.setPromptText("Select Moisture Goal");
         moistureList.setId("inputDropDownBox");
         moistureList.setEditable(true);
 
@@ -118,171 +121,124 @@ public class InputPopUpWindow {
 
         startButton.setOnAction(e -> {
 
-                    // Sets the start time
+            // Sets the start time
 
-                    START_TIME = CURRENT_DATE;
+            HelpingFunctions.START_TIME = CURRENT_DATE;
 
-                    // Retrieves the user inputs
-                    TREE_SPECIES = treeSpeciesList.getValue();
-                    DIMENSIONS = dimensionsList.getValue();
-                    SAWSET = sawsetList.getValue();
-                    if(moistureList.getValue() != null && moistureList.getValue().contains("%"))
-                    {
-                        MOISTURE_GOAL = moistureList.getValue().replace("%","");
-                    } else {
-                        MOISTURE_GOAL = moistureList.getValue();
-                    }
+            // Retrieves the user inputs
+            HelpingFunctions.TREE_SPECIES = treeSpeciesList.getValue();
+            HelpingFunctions.DIMENSIONS = dimensionsList.getValue();
+            HelpingFunctions.SAWSET = sawsetList.getValue();
+            if (moistureList.getValue() != null && moistureList.getValue().contains("%")) {
+                HelpingFunctions.MOISTURE_GOAL = moistureList.getValue().replace("%", "");
+            } else {
+                HelpingFunctions.MOISTURE_GOAL = moistureList.getValue();
+            }
 
 
-                    // If the input is null, sets the value to be empty
-                    if (treeSpeciesList.getValue() == null) {
-                        TREE_SPECIES = "";
-                    }
-                    if (dimensionsList.getValue() == null) {
-                        DIMENSIONS = "";
-                    }
-                    if (sawsetList.getValue() == null) {
-                        SAWSET = "";
-                    }
-                    if (moistureList.getValue() == null) {
-                        MOISTURE_GOAL = "";
-                    }
+            // If the input is null, sets the value to be empty
+            if (treeSpeciesList.getValue() == null) {
+                HelpingFunctions.TREE_SPECIES = "";
+            } else if (treeSpeciesList.getValue().length() > 10) {
+                treeSpeciesList.setPromptText("A maximum of 10 characters is allowed!");
+                err = true;
+            }
+            if (dimensionsList.getValue() == null) {
+                HelpingFunctions.DIMENSIONS = "";
+            }  else if (dimensionsList.getValue().length() > 10) {
+                dimensionsList.setPromptText("A maximum of 10 characters is allowed!");
+                err = true;
+            }
+            if (sawsetList.getValue() == null) {
+                HelpingFunctions.SAWSET = "";
+            } else if (sawsetList.getValue().length() > 10) {
+                sawsetList.setPromptText("A maximum of 10 characters is allowed!");
+                err = true;
+            }
+            if (moistureList.getValue() == null) {
+                HelpingFunctions.MOISTURE_GOAL = "";
+            } else if (moistureList.getValue().length() > 10) {
+                moistureList.setPromptText("A maximum of 10 characters is allowed!");
+                err = true;
+            }
 
-                    setTreeSpeciesText(TREE_SPECIES);
-                    setDimensionsText(DIMENSIONS);
-                    setSawsetText(SAWSET);
-                    setMoistureGoalText(MOISTURE_GOAL);
 
-                    window.close();
 
 
+            if (!err) {
 
 
-/*
-                    FutureTask[] randomNumberTasks = new FutureTask[1];
-                    Callable callable = new CallableExample();
-                    randomNumberTasks[0] = new FutureTask(callable);
-                    Thread t = new Thread(randomNumberTasks[0]);
-                    t.start();
+                setTreeSpeciesText(HelpingFunctions.TREE_SPECIES);
+                setDimensionsText(HelpingFunctions.DIMENSIONS);
+                setSawsetText(HelpingFunctions.SAWSET);
+                setMoistureGoalText(HelpingFunctions.MOISTURE_GOAL);
 
-                    try {
-                        System.out.println(randomNumberTasks[0].get());
-                    } catch (InterruptedException | ExecutionException ex) {
-                        ex.printStackTrace();
-                    }
+                window.close();
 
-                });
 
- */
 
-/*
+
+            // Fungerende ny thread!!@@@@@
+            // Gather data
+            try {
+                Thread thread = new Thread(() -> {
 
                     try {
-                        //getData();
-                        loadSingleSeries(setInputParameters());
-                        //loadMultipleSeries(setInputParameters());
-                        //loadSingleSeries();
-                        //loadMultipleSeries();
+                        // Henter her data fra databasen
+                        Map<Integer, Map<String, Number>> data = setInputParameters();
+                        Platform.runLater(() -> {
+                            try {
+                                loadSingleSeries(data);
+                            } catch (Exception ex) {
+                                ex.printStackTrace();
+                            }
+                        });
                     } catch (Exception ex) {
                         ex.printStackTrace();
                     }
                 }
-
                 );
-
- */
-
-
-
-
-
-
-
-/*
-            try{
-                Thread thread = new Thread(new Runnable() {
-
-                    @Override
-                    public void run() {
-                        try {
-                            // Henter her data fra databasen
-                            loadSingleSeries(setInputParameters(false,false,false,false));
-                            //loadSingleSeries();
-                            //loadMultipleSeries();
-                        } catch (Exception ex) {
-                            ex.printStackTrace();
-                        }
-                    }
-                });
+                thread.setDaemon(true);
                 thread.start();
+
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
-                }
-                );
-
- */
 
-                    // Fungerende ny thread!!@@@@@
-                    // Gather data
-                    try{
-                        Thread thread = new Thread(() -> {
+            // Retrieve data for current drying period
+            try {
+                Thread thread = new Thread(() -> {
+                    try {
+                        while (!HelpingFunctions.IS_FINISHED) {
 
+                            HelpingFunctions.STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
+                            Map<String, Number> data = getCurrentDrying();
+                            Platform.runLater(() -> {
                                 try {
-                                    // Henter her data fra databasen
-                                    Map<Integer, Map<String, Number>> data = setInputParameters();
-                                    Platform.runLater(() -> {
-                                        try {
-                                            loadSingleSeries(data);
-                                        } catch (Exception ex) {
-                                            ex.printStackTrace();
-                                        }
-                                    });
+                                    loadLiveData(data);
                                 } catch (Exception ex) {
                                     ex.printStackTrace();
                                 }
-                            }
-                        );
-                        thread.setDaemon(true);
-                        thread.start();
-
+                            });
+                            Thread.sleep(1000L * NUMBER_OF_SECONDS_LIVE_DATA);
+                        }
                     } catch (Exception ex) {
                         ex.printStackTrace();
                     }
+                }
+                );
+                thread.setDaemon(true);
+                thread.start();
 
-                    // Retrieve data for current drying period
-                        try{
-                            Thread thread = new Thread(() -> {
-                                try {
-                                    while(!IS_FINISHED){
-
-                                        STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
-                                        Map<String, Number> data = getCurrentDrying();
-                                        Platform.runLater(() -> {
-                                            try {
-                                                loadLiveData(data);
-                                            } catch (Exception ex) {
-                                                ex.printStackTrace();
-                                            }
-                                        });
-                                        Thread.sleep(1000L *NUMBER_OF_SECONDS_LIVE_DATA);
-                                    }
-                                } catch (Exception ex) {
-                                    ex.printStackTrace();
-                                }
-                            }
-                            );
-                            thread.setDaemon(true);
-                            thread.start();
-
-                        } catch (Exception ex) {
-                            ex.printStackTrace();
-                        }
-
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
 
+        }
                 }
 
         );
+
 /*
                     // Fungerende ny thread!!@@@@@
                     try{
@@ -374,5 +330,4 @@ public class InputPopUpWindow {
         window.setScene(scene);
         window.showAndWait();
     }
-
 }
diff --git a/src/main/java/com/application/GUI/OutputPopUpWindow.java b/src/main/java/com/application/GUI/OutputPopUpWindow.java
index 26f5a37..13f3d6a 100644
--- a/src/main/java/com/application/GUI/OutputPopUpWindow.java
+++ b/src/main/java/com/application/GUI/OutputPopUpWindow.java
@@ -1,6 +1,7 @@
 package com.application.GUI;
 
 import com.application.DB.DB;
+import com.application.DB.HelpingFunctions;
 import javafx.geometry.Pos;
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
@@ -46,7 +47,7 @@ public class OutputPopUpWindow {
                     try {
                         if(!moistureCheckTextField.getCharacters().toString().isEmpty() &&
                             !moistureCheckTextField.getCharacters().toString().equals("Please enter a value")) {
-                            STOP_TIME = null;
+                            HelpingFunctions.STOP_TIME = null;
                             DB.pushManMoisture(moistureCheckTextField.getCharacters().toString(), false);
                             NUMBER_OF_CHECKS++;
                             window.close();
@@ -65,7 +66,7 @@ public class OutputPopUpWindow {
             try {
                 if(!moistureCheckTextField.getCharacters().toString().isEmpty() &&
                     !moistureCheckTextField.getCharacters().toString().equals("Please enter a value")) {
-                    STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
+                    HelpingFunctions.STOP_TIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
                     DB.pushManMoisture(moistureCheckTextField.getCharacters().toString(),true);
                     window.close();
                 } else {
diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java
index 0f995ab..6db0831 100644
--- a/src/main/java/com/application/Main.java
+++ b/src/main/java/com/application/Main.java
@@ -1,5 +1,6 @@
 package com.application;
 
+import com.application.DB.HelpingFunctions;
 import com.application.GUI.InputPopUpWindow;
 import com.application.GUI.OutputPopUpWindow;
 import com.application.GUI.RingProgressIndicator;
@@ -162,7 +163,7 @@ public class Main extends Application {
         treeSpeciesText = new TextField();
         treeSpeciesText.setId("sideBarLabelText");
         treeSpeciesText.setPromptText("No Input");
-        treeSpeciesText.setText(TREE_SPECIES);
+        treeSpeciesText.setText(HelpingFunctions.TREE_SPECIES);
         treeSpeciesText.setEditable(false);
 
         Label dimensionsLabel = new Label("Width x Height");
@@ -170,7 +171,7 @@ public class Main extends Application {
         dimensionsText = new TextField();
         dimensionsText.setId("sideBarLabelText");
         dimensionsText.setPromptText("No Input");
-        dimensionsText.setText(DIMENSIONS);
+        dimensionsText.setText(HelpingFunctions.DIMENSIONS);
         dimensionsText.setEditable(false);
 
         Label sawsetLabel = new Label("Sawset");
@@ -178,7 +179,7 @@ public class Main extends Application {
         sawsetText = new TextField();
         sawsetText.setId("sideBarLabelText");
         sawsetText.setPromptText("No Input");
-        sawsetText.setText(SAWSET);
+        sawsetText.setText(HelpingFunctions.SAWSET);
         sawsetText.setEditable(false);
 
         Label moistureGoalLabel = new Label("Moisture Goal");
@@ -186,7 +187,7 @@ public class Main extends Application {
         moistureGoalText = new TextField();
         moistureGoalText.setId("sideBarLabelText");
         moistureGoalText.setPromptText("No Input");
-        moistureGoalText.setText(MOISTURE_GOAL);
+        moistureGoalText.setText(HelpingFunctions.MOISTURE_GOAL);
         moistureGoalText.setEditable(false);
 
         Label timeLeftLabel = new Label("Time Left");
@@ -226,11 +227,15 @@ public class Main extends Application {
 
             @Override
             public void run(){
+
                 try {
-                    Thread.sleep(100000);
+                    //Thread.sleep(10000);
+                    wait();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
+
+
                 while (true){
                     try {
                         Thread.sleep(100);
diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class
index e4a40bb5a814f32272d6ba8147e2d80a53fd2771..8a8f052bedc04191e9b98cb78b0532048a14e669 100644
GIT binary patch
delta 2411
zcmeA%yKh*3>ff$?3=9k=4DYxY%o*meGtA{;U;@$exEM?r=5sNyFf0IxECjI@fr!N%
z3`;;FOF^7v91P1r^a>7!l^hJKI2cxQFs$KVSj)k%j)P%62g3#~hK&rHI2l+NHghm+
z;b7Rx!LW^kVLJ!I4v^SRt_%hihFu^7c7upL91MFo81`{6?B`%O08(&}gW(W}KFq;z
zgp1)Q!!a&~;|wQ2tdk(&QydJZLG&3AaTY|J0}<!h87{ChT;yW7#BiC5!I<F+JHyq<
zGK^}I7cqA51o?ZpI)}u2x^OUDo4kohi}Cv8yG$*NH#R3RGc$5=24|+{C6<&HrEX4U
zxy{IUbF)3$Tvp~{hLXwmxlJu@G2G^1Xk@77VYtI^mxo~jh}Fta&B(wRmY9>9T9TPu
z%)@Yx;XV&T2S}9JyF7!3p_ie0vJX!O55of<hFc5|c^D!Yq9#A!u@_2Uh~i<G1TteX
zh?vGuJ=u^qN+gRRijjdcC^a!BEHS4vm4_jZA!_n`UU374M?4IV8J@5+Jmq0{#_*hn
z;RVA>9tH~rOGX9;9tJB0OCAPm1{)p*TM%K#U^Cf~Pn(C~6%WH}hBrJ6#SCvZSMYH%
zP2Mh$TyM_6z@Wt-3DV5Kz`zO845qCaY{0ZFl(qxYk_`3?4h)P8jtmS8Obkv8k_;{k
zmT<l+gCv6+gAJVT&LGL)fh6zAAj#l`#1~+YtY`2>5|Cn$Wbi@aOEX9^_#*LT86+9}
zkof)#k_-W876u~8^D{^?1R?PS7$g~jk@$iP^^y!BNCH9(k_@3pd=UmohA<?)D1#(J
zIFf}C43eNoWME{728T!tgCs*Nl6sJb;*j_t55*(#W$PIv84?(xPz*>!vLJ~;k|7yM
zgA#)zLkbdKnL&~v6^Sp%Ajy!1#0PmO9f_~PAjyz{#IILnkYvb2vJm8>EHnpYBWX})
zkYva~;)8sYi^P{@kOU=D6c6Pi$rmt4G87{0^Jgex;AdcBC}t>OU}Pv|U|=w2U}Ruq
zU|?X?+RnhZ5ge*z3=9mQf`);CkAa0jfT5fLl+3}37%CVl!RfS$p_+k-p>(p2h?y@)
zy$}Nn0|P@20|!GcgD68DgEB)tTptI6EJF=LEdv8X9n>U<NIe4sG#(omxInoZY@(yM
z_~c_EDoCc5GH@`IF-S0!GiWeWAepMf(1d0xNTeBVY6}A=Lo3vs=AybtCe|=;Fw`;#
zGSo3hG1McOD1u=kNTdyJVmkvDsDJ^xbEBwFJ;>*B4D1XH49yH23@r?T46O`O3~da`
z4DAd$44n*?3|&a38#8pGxfdjYY&s`H7ehD5bOr_n8E~{PFtBW5kl4V$z`)1=vW*Qa
z+6M_Y9)=zUE>JNC(lWV2%q$S3M2vxzfq`KX0|&!o20?}?3{nhJ8I&1jAUQ;qp%2X=
zAQ4oD^g|pnnO|H~7Gx^K;yDnD!S+so2CbvGHB!(nV&Gs{%pk$Agh7L0DUzK^3=`4p
z1c{(V)+DHjC&iH?Yb65*!zu<rhSdyG3~P`~1Vs&Mq5_E^`+|#MGStM4qFR%4C6tgN
zYy$%a!$t-{hD{7o44WC08MZL!Fl=M6WY~^mgE7MtG&h4pkZs^(m<kCe)Cf~UkFed4
zaDznHG^nGbB#|R*KLZED0R};agA7s(hZvL@jvzTimSH-YLqH;^4w(UQ$mE5RqF`@A
zBJ2djVul_D4u+ZVOn--gjR6Ff2x;zM(AvSEy^TR<GlQ;>-ev}Umdy+XteY7O1-Ldd
z80}^-j%3}-U=qp9v4ep%IFdzx4Mgu?Fx}2zwwXZ!AunJIl89sxu-L&+&l(I<A%~<w
z5UN55M8g!QAt?|BNkp;;fN7Wl4N##3N&IRIoD2*M!VG*2q71?e5)9%D(hSlJatsO#
awhRsot_+C`(F{!tNerBf470!`*=zux%w^dC

delta 2985
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
Ngn^L(6p~B~8v%Ot0l@$O

diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class
index aded3c064c967f49860ea32d288755bbb1f6538c..fe602725abb76a5f28ac86b93ded577f0a26ae0a 100644
GIT binary patch
delta 8126
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
b8JHNIKr>H_&J349<0qhz6NXBLOKh9~)_Eq>

delta 8147
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
SE1<y@21W)xhAM{3Y@7gm3ogX~

diff --git a/target/classes/com/application/DB/HelpingFunctions.class b/target/classes/com/application/DB/HelpingFunctions.class
index 77d4802660217db2dbb5a825bf559f40a6d64f55..02c6c2496dbe75eab1bb4555c012c1fd2df6346e 100644
GIT binary patch
delta 3247
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
IoM(^(0C$YJ_5c6?

delta 1749
zcmaFkbkD5*)W2Q(7#J8#7){w3y15wK7<$+ldN~;SxEPoj`Z*XTa4}3|m;~ZXW@nhf
z!7!DJfs>)1onaam0}sP=E`}KlGeN9b><qKH7z7yRa52nfn8(H7$}pdcL6l(uJHtW_
zh9w~8QV_8WB)y!SVFgIVN-l;~4E3wI7}hYXWoKB&%^=0Fft_I^7sDoo&Fl<YI2g8a
zF(@(ggZSIH7`8L);9}Uxu#1afH^Uw-hP@2?KxXV`XE*>-aEOz^mEkZK!x4s~+ziJU
zj&n1dU^odPPO&qbW@k9V#bC_P!@+PCM4tl@ySNyP7|wGs*j`|`$i;Ap;W8J)1%@lE
z3}C?g0%Z18E{1Ci*Fj#t!NqWs;TAW;ZH7DS40pL0oI!zfkDcNEW-TUOCax*$3=h~D
zrm-{3-t5T2&d9{@aIzO`0;AC6Kyi`Ht62XrvNAkkXE;51Eqmu=FHV1EZw8;qb2v@K
zycr%dGBAgRII}Z6;bC~n@QjDyIm3&|&pE4Yy%}DzGrZzqc+K#Jhv6-Q4<mzcR$^JA
zeokUux_(GTQGR)1Qcfxl!#jre><k}x7(Oz5;$aA52<Kt=%<y&cd@cuG9?!hI)FS7c
z#Ny)A;>mZpqy!nhF?{D?_`&d#hv65)Z$<{C$%!mVqC5;K45{o4e?VsZWoP&YQt^MX
zJ-01010&<)dTs@FhKD?iOpMHvmvQTBvoNx<GqUk8vNLk9Gjj4UaxrqVGxG2-d}QQh
zXXN8y_`%4}!;r?1&d6Xo`JssEWK$k-RRKmp9tL*?4|YZ&9!6nC5q3sV9!4=nadw7B
zJd6^Il01x3jM9?}dA#gp7-e}F<rwAJ85MXK6&aP-8I^e$RTx!y7}Xfnc^HBig4r20
zco;PqwRjk{8FknhbwM0Gc1C?3MgvB}%}04BF)<o%ju4o@#=@+j={fnCSiO)SBH%pp
zN>bBPizX+FXR)y}nlLh`Pqr15nA|97qU_4x#=yY9$iM+|DFY*eCj$cm6N486Cj%pc
zH-irYBZKc`0Vy$cKL!Q{HU>rp1_l8Je+C8y9x$7gA%G!}fq{Vo<VLVsUnw<xkXk+l
zW(EcZX$CF^83thnS-2i925yEBhEN6u1};#%F)%UsPF^InupXpGj)9$lfkB;ti$Rw`
zltGU{ib0>jnn9PrnL(c+jllqHh86=0gA{`zLj*%410#blLoh=WLo@>u0~bRaLkvSK
z0|P@E0~1s>j)8$8f`Q{dgC+wDJ3~A>LjpTPB0ED810y>_64!qQHn1=QNYD)`>dwxP
z^q)b1fsLIZ9xTC-!~oa9{GWk|feB&~0|P@c0|NsK10#bH0~aVQfxW^ZqYw7J7y~Fv
z*)cFP*fa1kI53DXI5NmG*rDi2V@L<<Nt1~}@_qn=2ty!)EJFx`B10&HHbVr1DMKWK
zJ3}<s`(g}C3=9mO3>gfW3=9k+45kcO4A~5f3?Q#^GBEvN&}L`Ikw&tHgCUn84`dAk
z1A`C9`5<jtI~X*!F=*~!(DKn{-pio9ZL+;A2iOf<VDmE>xEXSg>=R+gXDDD`VBlup
zgxZJjJ10XSLlM*h8E~RtU|`wApt}K_tU%EUNj7EBq*cto!BE0b3emyX%D}?F&A`C0
zTW8zkW3v0eZqQ=jVqjosW>92kWl&{kWAJ3?VkltfWth&;&#;7H62nS{DGb{grZMbd
zm=1Ph3<D=a0fRe38ACY(JHvDa1%?WSN(K&wB@Dt0RSX3TTnvf~(-^85Y8co+HZjyP
zcz{d0-3)aM<zN@@W~gUq0QtP0VK+k~LjgGL?q+CWC}3b=Xojcu-3+x1Ees6cz!qU(
z`NP1?&d~aY!Iqt&?H5DtF9s&47uy*)7&;(%hk=1X8Duah@OCpeM{Z|u+03B35iM+l
z8JHM4K^f1Ap^ITL0|SE*0~>=V!(4_%44e#d3{nj188{iV8Kf8vGH^0{VKib`#KOt2
QhG7+$-pjC?VG)BQ0BgNAdjJ3c

diff --git a/target/classes/com/application/GUI/InputPopUpWindow.class b/target/classes/com/application/GUI/InputPopUpWindow.class
index 22435a873bdd72d725141bb68ad28bf4d1bb7f2d..ec23024f7901048579ea5337beb875b1acf78e64 100644
GIT binary patch
delta 3666
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

delta 3271
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
b9m9Ku4<Ht!G@}foG?b+bXX(LNW{lDR(i)Cg

diff --git a/target/classes/com/application/GUI/OutputPopUpWindow.class b/target/classes/com/application/GUI/OutputPopUpWindow.class
index f30d763a28232c3f200b56a674d1c96e17dc89e1..c16bf4ace2945df72d5db9f7d92fd70762c028a4 100644
GIT binary patch
delta 779
zcmdm_a$AM#)W2Q(7#J8#7}+;+=`wPzXV}2bu#uf%(`E<8yG)9kc^I}ZY~^9t#;~1{
zfzLNTv$&+RC{@8ZBQ-gjhhYc9&dGKxigG&{88|ZY3Q9{t@(Xwvb}{T^XV}fdu!mtU
z55qo&{gZ216qye&?47)jCEo5J!(K)P0jK=@lH!u0!~);cl8pS6VtzJ;Ljnwk`Pmqb
z2rwMwVK~NcoQL5A!%0R4Hn+^Y%;F4wHilD-3=)$MFiCLnFnBPW=3zL)aCUM6s~Fok
z9)|M_7be%RN^)N0VYtL_mXSea@&Y!I$(vX$j4tyqTw%D%&Tx%~;X1<&9)_C?w|E$C
zGu+`}xXa+l!*Gw`K0Ct$9)^buH`o~-@i07QcrsarP155j!!1Sz;mXR&N?l)H-INps
z4-c!{T&v<@c7|s>49^)}urs{mVR*&xnup;H!&`QScRUR589uNxeB@#H#PFGi;S0#{
zuM9gU*Rn})e`D}uXZX&;@Ppy!=DBPUjLg3neoy|vF30+ZkwI2tvOlxjWJ``d#=o0S
zaJ*qsR!+{()lV!a$jMAjEXmBz(|2*w_ejkt$jnQ3E6qy=2~EDhJyBK$i#q50yyB9?
zyprO{@jQ}j|9BYwGcr%E<FRLCoxG3dB?}uPgX&~MUh&C?cvBgLH*4^@GS-VTa4<+P
z@H0p<h%(49$TP??s4~bg=rAZUm@z0Z*f1zFI5Vg)cr&On1Tv^GL@;PGBs1tRWHIP6
z6fx*A)G^pGbTZg8Oki+en8D!4u!JFyVFN=D!w!aEhPw=*4DT4i7?~Nu895mu7<m~Y
z8GINR7=jo$7&sW&7y=jq85kzN;Xk74%pkzv!l1z5%Am*K#$e6h&fvu0$>71@%izu6
z&EUh}!w|sWH~Ff-UQGiA0R}?`1qLGq6$WDlLk1HDO9oR02L^KnHwGI9PX;RnF9vG{
yKL*>$y9Ir;nHU%txEL5285mg@85txQ>KPaq#2A<u8W@-v8X1}xnxU+AhGqbj1kEJ?

delta 693
zcmcbuvPp&O)W2Q(7#J8#7+E)R=`wOIXIRh9uz{Un<7NlOyG)9kco;S_Y~f+p%CL=*
zfzLNTv$&+RC{@8ZBQ-gjhhaOzj>&c`igG&`88|ZY3Q9{t@(Xwvb~5Z>XV}HVu$y5I
z55r!DeUoch6q)xk?3uifCEo4;!yZNk0jK=@lH!u0!~);cl8pS6VtzJ;g8~eP_}Lf^
z3osnvVK~ZgjECVk!wE(PHn+^Y%;F4wHinao3=)$MFiCLnFnBPW;$b+=aAtA>s~Fo^
z9)@!a=O@>&O0r$xVYtX}X7X%Sf1^u043`<MurplcVYtR{ormED!%ZHBTMV~(81685
z@-W<GxW~?LpNHWA!*zCshdd0A7#>fSVUzTD!f=z3LAbKAvQpRAS2ra^!NbEUH`l7T
zn4RG%55qHt=j;qGco<$Xyy9Va&G3eu;VlotJBIh{3?FzHJ~DjbVfYL({0qa5$+c_}
z9A814Zw%izFJOycWd6bMbMkL?Io4l{46+)N{h8$^+i>(T{@#3=;|<f~Y##Z^ce(py
z1^hyNom_+B{oUf7JzSl=gBckZJ=q!l@G$&kWSqR5$DWaS@^hY-j4YEc^42p7Z4Tsf
zWvmxt;9wAE;AfCv5M_{NkY|u#P-T#1&|y$uFk?_;uwhVQaAr_u@Mch92xL%Yh+xoS
zNM_Jx$YRi8C}PlMsAI5Y=wz^Cn80AqFoVH?VF^P3!v=;xh8+w+40jnq7~V02GBPuS
zF>*45Gx9P-F!(SqFa$AhFmN!kF$6FKGB8XQ6*!{m#2~=n%%H&F!l1|C%3#gl#^A)@
z!QjE*!{E)}1ttR+d?)`C*sH0}Ai!Y2puk|rpu%9pV8~$1V98*@;J{$U;KpFh;K^Xg
i;Kg9Y;KyJy`H7$pF9QPu0~Z4$!#_qQhX0doh2#JX5448>

diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class
index 96fdabd6ebabc2018a0dd6405c464e591d7e57cb..a51def592eaa17118238adab46681e5e8925464e 100644
GIT binary patch
delta 755
zcmcaEcvsNo)W2Q(7#J8#7)m)Agc%ID7(^HhK`bK>Va&x~!eGkIV8+G3#$e9M00Ai=
zMHXBPCL0}|FiJ@>NbxX8GpO<~h%-p=Fo-gUu`~GdFa$8DPPS%JjZ@`e2x184VF+Oe
zWoHQEVF+i4U}uQrVTfXgW@m`uVTfgj<6($rNMK|TaLUgwDK05WEbvV&$;eMB=4WF_
z6kt&0XJ<&_VNhX6W@kv@VMt|2V`oU`VaQ;}WMoj9ypcs|@;#<#OM$G!vPAuy#JqHU
z|D>$c<Pt^(mh!~R5=I98f}+g4lHiiW<m`~5#N<>)2G-)7)YJk-1{Mu3&9Kec%$AHC
zSq#}+48jaKlh?2u=Fa6|$YUtvVbEewom|Cg%2+&k1M4l85=I8q$%bsQlUK9pXbUrl
zFfcGMGcbVs3l0@=1_=fR0RaX{1}U%%BZD-93<D#B>|`c()p|Jw1_mJp76t}}2MnAH
z_ZavX9x@0sJYtY%U|>)Hn<K)Yz@Q8^Nd#;LBLf422-tKc21W)I233$*3=9kp8CV#Y
z7#J9Qw6-y@E@$BI(cZ?uF2caEgMn)~gA|yjwT*#$8w1Y{2Hs5!e2m)L82CB0b}<Mr
zFzjFuoV<};rk;g?oq>&khe3!zl!1+bnE~WFD+WFW28NdmEDUcL*co0ia4@`P;9>a4
zAjI&ML6qSWgBZhS1}TOw3_1+o7)%*{FxWHvWbk14#o*2G7w!uV1{MZ226YBT1~CRP
zD2su?2kJ8o1_lOR23B`=VFpbW4|WDkF*yMyP#}YRHaVU{EJ<i10|NsS*g0$rpaA#=
zHkt>_=7Ac+!k`USrNf}hz`(%5pvR!kpac$HCI(>!1_nh228MiwB8CD6Nd`v-1_qFB
NCkAE)X9gDrX8^?!a(n;)

delta 796
zcmcaBcwNxp)W2Q(7#J8#7)m%9L>LUY7(^M2KrCYrVZzD)0*q}7K;owC3}##m91P|V
zQ3i$-E(VK@HcuGEr5L1n7-SgKco-xYBzYLb7{qxP{22l!TQR9ds<AT!@h}84gs?M&
z@-T!kgtIe5@GwL&M6okO^Dx9P#PTr2F~l=62sq{EmlT&2B^LOmmSp6o6!Wt&BnU95
z@v}1|@-V0}B(XCj^Dv|^q_Q)l@i3$_WK7=0)L_I~oRgYbz{tR&;iVbI$iQDvl$lo&
zT#}fa9a5B-oXW@`kd;`LsGpOVm#*)hl$DxXvbmVql94x)A&ZMagdv-e!Aiqt@?IvT
z$+ubNaOdza<T4cSFlaNVO>SZ}Wh|P!gY_0mF(ZTO<o~SVlLOe;CU0ib(H3D4Wnf@n
zW?%sM6cj)pZ!<6m2rx)7NP}e<8Dtn_85kMlCUdc?*2^<6FbFZQFfcG&XW(SG%D~5P
zgF%?#CW8V41A_wC91#XZ1{JVLB49HZ85kHuz@{@XFfynzsDaF4U|@L6z{0@9z`)=q
z!oa$NfqgjxhmZC)22K$ME-+6D%+uP&z_X2kcLxLCCI)^+?QQi80$RHm1Q{51FbHWy
zZed_%N!ZH3thI%KSs-P}|KrOUm^XqAWn<uE;9%fm5MdB!;9y{806E)=fscWK;T{7U
z!$Ss6hWiX$3=bIi7@jbQFuY(8XL!mW!SIYhhT%Db9>YrpbB5Opjtp-Yycpgx_%eKe
zd#|30frUYxL4$#jL4rXH%3@&fgZf#Mfq{XSfz^|pL5szMok2@XPJjs%15huUF@S=A
zfq_SB3j+(t(c2h=H!?6VFoE62#sCVcmtebiz-%6<u`CQaU{$&d#(E443@i-#3<eC!
o;Fw@y5Mf|oP-0+U$YUsE$Y+pbaAaU$0BLt(U}kV;aA9x;0ATNW(EtDd

diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class
index 4f200bb95090d532276bac28a3d5cf147cbf33a6..b6446f4af04adaa9f76154868bba310c78b38b99 100644
GIT binary patch
delta 3642
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
Q$!NuB4P`mNS<Z~s02C_o1^@s6

delta 3154
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
XGouazGovn}9-}^#WddiJGwK5Xt$=s=

-- 
GitLab