diff --git a/ModSim.sln b/ModSim.sln
new file mode 100644
index 0000000..86b6676
--- /dev/null
+++ b/ModSim.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34616.47
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModSim", "Source\ModSim.csproj", "{38E5D197-82BB-42DE-83F8-9D550D09BCDC}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {38E5D197-82BB-42DE-83F8-9D550D09BCDC}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {6433F537-FF66-4873-9EF1-DD21CA75C863}
+ EndGlobalSection
+EndGlobal
diff --git a/Source/App.config b/Source/App.config
new file mode 100644
index 0000000..f3ccc49
--- /dev/null
+++ b/Source/App.config
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+ 29999
+
+
+ 28888
+
+
+ True
+
+
+ 0
+
+
+ 0
+
+
+ en
+
+
+ Default
+
+
+ 0
+
+
+ 0
+
+
+
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ 192
+
+
+ 168
+
+
+ 1
+
+
+ 127
+
+
+ 255
+
+
+ 255
+
+
+ 255
+
+
+
+
+
+
+
diff --git a/Source/Classes/CGLM.cs b/Source/Classes/CGLM.cs
new file mode 100644
index 0000000..5880977
--- /dev/null
+++ b/Source/Classes/CGLM.cs
@@ -0,0 +1,233 @@
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public static class NudChk
+ {
+ public static bool CheckValue(this NumericUpDown numericUpDown, ref decimal value)
+ {
+ if (value < numericUpDown.Minimum)
+ {
+ value = numericUpDown.Minimum;
+ MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name
+ + " \n\rMinimum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File",
+ "Critical Settings Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return true;
+ }
+ else if (value > numericUpDown.Maximum)
+ {
+ value = numericUpDown.Maximum;
+ MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name
+ + " \n\rMaximum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File",
+ "Critical Settings Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return true;
+ }
+
+ //value is ok
+ return false;
+ }
+
+ public static bool CheckValueCm(this NumericUpDown numericUpDown, ref double value)
+ {
+ //convert to cm
+ value *= 100;
+ bool isChanged = false;
+
+ if (value < (double)numericUpDown.Minimum)
+ {
+ value = (double)numericUpDown.Minimum / 2.4;
+ MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name
+ + " \n\rMinimum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File",
+ "Critical Settings Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ isChanged = true;
+ }
+ else if (value > (double)numericUpDown.Maximum)
+ {
+ value = (double)numericUpDown.Maximum / 2.6;
+ MessageBox.Show("Serious Settings Problem with - " + numericUpDown.Name
+ + " \n\rMaximum has been exceeded\n\rDouble check ALL your Settings and \n\rFix it and Resave Vehicle File",
+ "Critical Settings Warning",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ isChanged = true;
+ }
+
+ //revert back to meters
+ value *= 0.01;
+
+ //value is ok
+ return isChanged;
+ }
+ }
+
+ public static class glm
+ {
+ public static byte[] Combine(byte[] first, byte[] second)
+ {
+ byte[] ret = new byte[first.Length + second.Length];
+ Buffer.BlockCopy(first, 0, ret, 0, first.Length);
+ Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
+ return ret;
+ }
+
+ //Regex file expression
+ public const string fileRegex = "(^(PRN|AUX|NUL|CON|COM[1-9]|LPT[1-9]|(\\.+)$)(\\..*)?$)|(([\\x00-\\x1f\\\\?*:\";|/<>])+)|([\\.]+)";
+
+ //inches to meters
+ public const double in2m = 0.0254;
+
+ //meters to inches
+ public const double m2in = 39.3701;
+
+ //meters to feet
+ public const double m2ft = 3.28084;
+
+ //Hectare to Acres
+ public const double ha2ac = 2.47105;
+
+ //Acres to Hectare
+ public const double ac2ha = 0.404686;
+
+ //Meters to Acres
+ public const double m2ac = 0.000247105;
+
+ //Meters to Hectare
+ public const double m2ha = 0.0001;
+
+ // liters per hectare to us gal per acre
+ public const double galAc2Lha = 9.35396;
+
+ //us gal per acre to liters per hectare
+ public const double LHa2galAc = 0.106907;
+
+ //Liters to Gallons
+ public const double L2Gal = 0.264172;
+
+ //Gallons to Liters
+ public const double Gal2L = 3.785412534258;
+
+ //the pi's
+ public const double twoPI = 6.28318530717958647692;
+
+ public const double PIBy2 = 1.57079632679489661923;
+
+
+
+
+ //Degrees Radians Conversions
+ public static double toDegrees(double radians)
+ {
+ return radians * 57.295779513082325225835265587528;
+ }
+
+ public static double toRadians(double degrees)
+ {
+ return degrees * 0.01745329251994329576923690768489;
+ }
+
+ //Distance calcs of all kinds
+ public static double Distance(double east1, double north1, double east2, double north2)
+ {
+ return Math.Sqrt(
+ Math.Pow(east1 - east2, 2)
+ + Math.Pow(north1 - north2, 2));
+ }
+
+ public static double DistanceLonLat(double lon1, double lat1, double lon2, double lat2)
+ {
+ const int EarthMeanRadius = 6371;
+
+ double dlon = toRadians(lon2 - lon1);
+ double dlat = toRadians(lat2 - lat1);
+
+ double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(toRadians(lat1)) * Math.Cos(toRadians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
+ double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
+ return angle * EarthMeanRadius;
+ }
+
+ //float functions
+ public static float acos(float x)
+ {
+ return (float)Math.Acos(x);
+ }
+
+ public static float acosh(float x)
+ {
+ if (x < 1f) return 0f;
+ return (float)Math.Log(x + Math.Sqrt((x * x) - 1f));
+ }
+
+ public static float asin(float x)
+ {
+ return (float)Math.Asin(x);
+ }
+
+ public static float asinh(float x)
+ {
+ return (x < 0f ? -1f : (x > 0f ? 1f : 0f)) * (float)Math.Log(Math.Abs(x) + Math.Sqrt(1f + (x * x)));
+ }
+
+ public static float atan(float y, float x)
+ {
+ return (float)Math.Atan2(y, x);
+ }
+
+ public static float atan(float y_over_x)
+ {
+ return (float)Math.Atan(y_over_x);
+ }
+
+ public static float atanh(float x)
+ {
+ if (Math.Abs(x) >= 1f) return 0;
+ return 0.5f * (float)Math.Log((1f + x) / (1f - x));
+ }
+
+ public static float cos(float angle)
+ {
+ return (float)Math.Cos(angle);
+ }
+
+ public static float cosh(float angle)
+ {
+ return (float)Math.Cosh(angle);
+ }
+
+ public static float toDegrees(float radians)
+ {
+ return radians * 57.295779513082325225835265587528f;
+ }
+
+ public static float toRadians(float degrees)
+ {
+ return degrees * 0.01745329251994329576923690766743f;
+ }
+
+ public static float sin(float angle)
+ {
+ return (float)Math.Sin(angle);
+ }
+
+ public static float sinh(float angle)
+ {
+ return (float)Math.Sinh(angle);
+ }
+
+ public static float tan(float angle)
+ {
+ return (float)Math.Tan(angle);
+ }
+
+ public static float tanh(float angle)
+ {
+ return (float)Math.Tanh(angle);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Classes/CSettings.cs b/Source/Classes/CSettings.cs
new file mode 100644
index 0000000..6546918
--- /dev/null
+++ b/Source/Classes/CSettings.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Configuration;
+using System.IO;
+using System.Linq;
+using System.Xml.Linq;
+using System.Xml.XPath;
+
+
+namespace AgTwo
+{
+ public static class SettingsIO
+ {
+ ///
+ /// Import an XML and save to 1 section of user.config
+ ///
+ /// Either Settings or Vehicle or Tools
+ /// Usually Documents.Drive.Folder
+ internal static void ImportSettings(string settingsFilePath)
+ {
+ if (!File.Exists(settingsFilePath))
+ {
+ throw new FileNotFoundException();
+ }
+
+ //var appSettings = Properties.Settings.Default;
+ try
+ {
+ Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
+
+ string sectionName = "";
+
+ sectionName = Properties.Settings.Default.Context["GroupName"].ToString();
+
+ XDocument document = XDocument.Load(Path.Combine(settingsFilePath));
+ string settingsSection = document.XPathSelectElements($"//{sectionName}").Single().ToString();
+ config.GetSectionGroup("userSettings").Sections[sectionName].SectionInformation.SetRawXml(settingsSection);
+ config.Save(ConfigurationSaveMode.Modified);
+
+ {
+ Properties.Settings.Default.Reload();
+ }
+ }
+ catch (Exception) // Should make this more specific
+ {
+ // Could not import settings.
+ {
+ Properties.Settings.Default.Reload();
+ }
+ }
+ }
+
+ internal static void ExportSettings(string settingsFilePath)
+ {
+ Properties.Settings.Default.Save();
+
+ //Export the entire settings as an xml
+ Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
+ config.SaveAs(settingsFilePath);
+ }
+ }
+}
diff --git a/Source/Forms/Controls.Designer.cs b/Source/Forms/Controls.Designer.cs
new file mode 100644
index 0000000..403929f
--- /dev/null
+++ b/Source/Forms/Controls.Designer.cs
@@ -0,0 +1,454 @@
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Net.Sockets;
+using System.Net;
+using System.Text;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+using System.Globalization;
+
+namespace AgTwo
+{
+ public partial class FormLoop
+ {
+ private string TimeNow = "";
+
+ //Our two new nmea strings
+ private readonly StringBuilder sbOGI = new StringBuilder();
+ private readonly StringBuilder sbNDA = new StringBuilder();
+
+ private readonly StringBuilder sbHDT = new StringBuilder();
+ private readonly StringBuilder sbRMC = new StringBuilder();
+
+ private readonly StringBuilder sbGGA = new StringBuilder();
+ private readonly StringBuilder sbVTG = new StringBuilder();
+ private readonly StringBuilder sbAVR = new StringBuilder();
+ private readonly StringBuilder sbKSXT = new StringBuilder();
+
+ //The entire string to send out
+ private readonly StringBuilder sbSendText = new StringBuilder();
+
+ //GPS related properties
+ private readonly int fixQuality = 8, sats = 12;
+
+ private readonly double HDOP = 0.9;
+ public double altitude = 300;
+ private char EW = 'W';
+ private char NS = 'N';
+
+ public double latitude, longitude;
+
+ private double latDeg, latMinu, longDeg, longMinu, latNMEA, longNMEA;
+ public double speed = 0.6, headingTrue, stepDistance = 0.05, steerAngle;
+ private double degrees, roll = 0;
+
+ private int rollIMU = 1, headingIMU = 0, pitchIMU = 0;
+
+ private const double ToRadians = 0.01745329251994329576923690768489, ToDegrees = 57.295779513082325225835265587528;
+
+ //The checksum of an NMEA line
+ private string sumStr = "";
+
+ private void simTimer_Tick(object sender, EventArgs e)
+ {
+ stepDistance = tbarSpeed.Value * 0.027777777777 * (0.1);
+
+ steerAngle = tbarSteerAngleWAS.Value * 0.01;
+
+ double temp = (stepDistance * Math.Tan(steerAngle * 0.02) / 2.5);
+ headingTrue += temp;
+
+ if (headingTrue > (2.0 * Math.PI)) headingTrue -= (2.0 * Math.PI);
+ if (headingTrue < 0) headingTrue += (2.0 * Math.PI);
+
+ //Calculate the next Lat Long based on heading and distance
+ degrees = ToDegrees * headingTrue;
+
+ headingIMU = (int)(degrees*10);
+
+ CalculateNewPostionFromBearingDistance(ToRadians * latitude, ToRadians * longitude, headingTrue, stepDistance / 1000.0);
+
+ //calc the speed
+ speed = Math.Round(1.944 * stepDistance * 1.0 / (0.1), 1);
+
+
+ TimeNow = DateTime.UtcNow.ToString("HHmmss.fff,", CultureInfo.InvariantCulture);
+
+ if (cboxVTG.Checked)
+ {
+ BuildVTG();
+ sbSendText.Append(sbVTG.ToString());
+ SendUDPMessage(sbVTG.ToString());
+ }
+ if (cboxAVR.Checked)
+ {
+ BuildAVR();
+ sbSendText.Append(sbAVR.ToString());
+ SendUDPMessage(sbAVR.ToString());
+ }
+ if (cboxHDT.Checked)
+ {
+ BuildHDT();
+ sbSendText.Append(sbHDT.ToString());
+ SendUDPMessage(sbHDT.ToString());
+ }
+ if (cboxGGA.Checked)
+ {
+ BuildGGA();
+ sbSendText.Append(sbGGA.ToString());
+ SendUDPMessage(sbGGA.ToString());
+ }
+ if (cboxRMC.Checked)
+ {
+ BuildRMC();
+ sbSendText.Append(sbRMC.ToString());
+ SendUDPMessage(sbRMC.ToString());
+ }
+ if (cboxOGI.Checked)
+ {
+ BuildOGI();
+ sbSendText.Append(sbOGI.ToString());
+ SendUDPMessage(sbOGI.ToString());
+ }
+
+ if (cboxNDA.Checked)
+ {
+ BuildNDA();
+ sbSendText.Append(sbNDA.ToString());
+ SendUDPMessage(sbNDA.ToString());
+ }
+
+ if (cboxKSXT.Checked)
+ {
+ BuildKSXT();
+ sbSendText.Append(sbKSXT.ToString());
+ SendUDPMessage(sbKSXT.ToString());
+ }
+
+ sbSendText.Clear();
+ }
+
+ public void CalculateNewPostionFromBearingDistance(double lat, double lng, double bearing, double distance)
+ {
+ double R = distance / 6371.0; // Earth Radius in Km
+
+ double lat2 = Math.Asin((Math.Sin(lat) * Math.Cos(R)) + (Math.Cos(lat) * Math.Sin(R) * Math.Cos(bearing)));
+ double lon2 = lng + Math.Atan2(Math.Sin(bearing) * Math.Sin(R) * Math.Cos(lat), Math.Cos(R) - (Math.Sin(lat) * Math.Sin(lat2)));
+
+ latitude = ToDegrees * lat2;
+ longitude = ToDegrees * lon2;
+
+ //convert to DMS from Degrees
+ latMinu = latitude;
+ longMinu = longitude;
+
+ latDeg = (int)latitude;
+ longDeg = (int)longitude;
+
+ latMinu -= latDeg;
+ longMinu -= longDeg;
+
+ latMinu = Math.Round(latMinu * 60.0, 7);
+ longMinu = Math.Round(longMinu * 60.0, 7);
+
+ latDeg *= 100.0;
+ longDeg *= 100.0;
+
+ latNMEA = latMinu + latDeg;
+ longNMEA = longMinu + longDeg;
+
+ if (latitude >= 0) NS = 'N';
+ else NS = 'S';
+ if (longitude >= 0) EW = 'E';
+ else EW = 'W';
+ }
+
+ //calculate the NMEA checksum to stuff at the end
+ public void CalculateChecksum(string Sentence)
+ {
+ int sum = 0, inx;
+ char[] sentence_chars = Sentence.ToCharArray();
+ char tmp;
+ // All character xor:ed results in the trailing hex checksum
+ // The checksum calc starts after '$' and ends before '*'
+ for (inx = 1; ; inx++)
+ {
+ tmp = sentence_chars[inx];
+ // Indicates end of data and start of checksum
+ if (tmp == '*')
+ break;
+ sum ^= tmp; // Build checksum
+ }
+ // Calculated checksum converted to a 2 digit hex string
+ sumStr = String.Format("{0:X2}", sum);
+ }
+
+ private void BuildGGA()
+ {
+ sbGGA.Clear();
+ sbGGA.Append("$GPGGA,");
+ sbGGA.Append(TimeNow);
+ sbGGA.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(',');
+ sbGGA.Append(Math.Abs(longNMEA).ToString("00000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(',');
+ sbGGA.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',').Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',').Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',').Append("1000");
+ sbGGA.Append(",M,46.9,M,37.1,,*");
+
+ CalculateChecksum(sbGGA.ToString());
+ sbGGA.Append(sumStr);
+ sbGGA.Append("\r\n");
+ }
+
+ private void BuildVTG()
+ {
+ sbVTG.Clear();
+ sbVTG.Append("$GPVTG,");
+ sbVTG.Append(degrees.ToString("N5", CultureInfo.InvariantCulture));
+ sbVTG.Append(",T,034.4,M,");
+ sbVTG.Append(speed.ToString(CultureInfo.InvariantCulture));
+ sbVTG.Append(",N,");
+ sbVTG.Append((speed * 1.852).ToString(CultureInfo.InvariantCulture));
+ sbVTG.Append(",K*");
+
+ CalculateChecksum(sbVTG.ToString());
+ sbVTG.Append(sumStr);
+ sbVTG.Append("\r\n");
+ }
+
+ private void BuildHDT()
+ {
+ sbHDT.Clear();
+ sbHDT.Append("$GNHDT,");
+ sbHDT.Append(degrees.ToString("N5", CultureInfo.InvariantCulture));
+ sbHDT.Append(",T*");
+
+ CalculateChecksum(sbHDT.ToString());
+ sbHDT.Append(sumStr);
+ sbHDT.Append("\r\n");
+ }
+
+ private void BuildAVR()
+ {
+ sbAVR.Clear();
+ sbAVR.Append("$PTNL,AVR,");
+ sbAVR.Append(TimeNow);
+ sbAVR.Append(degrees.ToString("N5", CultureInfo.InvariantCulture)); //field 2
+
+ sbAVR.Append(",Yaw,-2.1,Tilt,"); //field 3,4,5
+
+ sbAVR.Append(roll.ToString() + ",Roll,"); //field 6,7
+
+ sbAVR.Append("444.232,3,1.2,17*"); //field 8 thru 12
+
+ CalculateChecksum(sbAVR.ToString());
+ sbAVR.Append(sumStr);
+ sbAVR.Append("\r\n");
+ }
+
+ private void BuildOGI()
+ {
+
+ sbOGI.Clear();
+ sbOGI.Append("$PAOGI,");
+
+ sbOGI.Append(TimeNow);
+ sbOGI.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(',');
+ sbOGI.Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(',');
+
+ sbOGI.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append("1000,3.2,") //10
+ .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(degrees.ToString("N5", CultureInfo.InvariantCulture)).Append(',')
+ .Append(roll.ToString(CultureInfo.InvariantCulture)).Append(",0.12,359.9,T*");
+
+ CalculateChecksum(sbOGI.ToString());
+ sbOGI.Append(sumStr);
+ sbOGI.Append("\r\n");
+ }
+
+ private void BuildNDA()
+ {
+
+ sbNDA.Clear();
+ sbNDA.Append("$PANDA,");
+
+ sbNDA.Append(TimeNow);
+ sbNDA.Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(',');
+ sbNDA.Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(',');
+
+ sbNDA.Append(fixQuality.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(sats.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(HDOP.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append("1000,3.2,") //10
+ .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append((headingIMU).ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append((rollIMU).ToString(CultureInfo.InvariantCulture)).Append(",32,298").Append("*");
+
+ CalculateChecksum(sbNDA.ToString());
+ sbNDA.Append(sumStr);
+ sbNDA.Append("\r\n");
+ }
+
+ private void BuildKSXT()
+ {
+ sbKSXT.Clear();
+ sbKSXT.Append("$KSXT,"); //1
+
+ sbKSXT.Append(TimeNow);
+ sbKSXT.Append(Math.Abs(longitude).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',');
+ sbKSXT.Append(Math.Abs(latitude).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',');
+
+ sbKSXT.Append(altitude.ToString(CultureInfo.InvariantCulture)).Append(',') //altitude
+ .Append(degrees.ToString("N5", CultureInfo.InvariantCulture)) //true heading
+ .Append(",22,35,") // Pitch, SpeedAngle
+ .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(roll.ToString(CultureInfo.InvariantCulture)).Append(",3,3,13,-1075,-98,-8,,,,37,13,,")
+ .Append("*3FCF0C9B");
+
+ //sbKSXT.Append(sumStr);
+ sbKSXT.Append("\r\n");
+ }
+
+ /*
+ $KSXT $KSXT Log header
+
+ 2 20191219093115.00 YYYYMMDDhhmmss.ss Satellite time in format of yyyymmddhhmmss.ss,
+ e.g. 2016040106284180 means
+ 2016(year)4(month)1(day)06(hour)28(mins)41.80(secs)
+
+ 3 112.87713062 x1 Longitude(°)
+
+ 4 28.23315515 x2 Latitude(°)
+
+ 5 65.5618 x3 Height (m)
+
+ 6 0.00 x4 Yaw, the angle between the line connecting two
+ antennas and True North (primary antenna
+ positioning and secondary antenna heading) (0°
+ 360°)
+
+ 7 0.00 x5 Pitch (-90° 90°)
+
+ 8 336.65 x6 Speed angle, the angle between vehicle traveling
+ direction and True North (0° 360°)
+
+ 9 0.010 x7 Speed in vehicle traveling direction (km/h)
+
+ 10 x8 Roll (-90° 90°)
+
+ 11 3 x9 Positioning status: 0-invalid solution; 1-single point solution;
+ 2-RTK floating point; 3-RTK fixed point
+
+ 12 0 x10 Heading status: 0-invalid solution; 1-single point solution;
+ 2-RTK floating point; 3-RTK fixed point
+
+ 13 0 x11 Number of satellites used in heading
+
+ 14 23 x12 Number of satellites used in positioning (primary antenna)
+
+ 15 -1075.146 x13 East position under geographic coordinates with
+ the base station as the origin (m) (empty if none)
+
+ 16 -98.462 x14 North position under geographic coordinates with
+ the base station as the origin (m) (empty if none)
+
+ 17 -8.618 x15 Up position under geographic coordinates with
+ the base station as the origin (m) (empty if none)
+
+ 18 -0.004 x16 East speed under geographic coordinates (km/h)
+ (empty if none)
+
+ 19 0.009 x17 North speed under geographic coordinates (km/h)
+ (empty if none)
+
+ 20 0.004 x18 Up speed under geographic coordinates (km/h)
+ (empty if none)
+
+ 21 1.0 x19 Age of differential
+
+ 22 30 x20 Number of satellites tracked in base station
+
+ 23 x23 Reserved
+
+ 23 Parity 3FCF0C9B XOR check sum (Hex string, check from the
+ beginning of the frame)
+
+
+ */
+
+ private void BuildRMC()
+ {
+ sbRMC.Clear();
+ sbRMC.Append("$GPRMC,")
+ .Append(TimeNow).Append("A,")
+ .Append(Math.Abs(latNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(NS).Append(',')
+ .Append(Math.Abs(longNMEA).ToString("0000.0000000", CultureInfo.InvariantCulture)).Append(',').Append(EW).Append(',')
+ .Append(speed.ToString(CultureInfo.InvariantCulture)).Append(',')
+ .Append(degrees.ToString("N5", CultureInfo.InvariantCulture))
+ .Append(",230394,359.9*");
+
+ CalculateChecksum(sbRMC.ToString());
+ sbRMC.Append(sumStr);
+ sbRMC.Append("\r\n");
+ }
+
+
+ private void lblWAS_Click(object sender, EventArgs e)
+ {
+ tbarSteerAngleWAS.Value = 0;
+ }
+
+ private void tbarSteerAngleWAS_Scroll(object sender, EventArgs e)
+ {
+ steerAngleActual = tbarSteerAngleWAS.Value * 0.01;
+ lblWAS.Text = "Steer Angle: " + (steerAngleActual).ToString("N2") + "°";
+ }
+
+ private void tbarSpeed_Scroll(object sender, EventArgs e)
+ {
+ if (tbarSpeed.Value < 0) Kmh.BackColor = Color.Salmon;
+ else Kmh.BackColor = Color.LightGreen;
+
+ Kmh.Text = "Kmh: " + (tbarSpeed.Value * 0.1).ToString("N1");
+ mSec.Text = "M/Sec: " + (tbarSpeed.Value * 0.027777777777).ToString("N1");
+ }
+
+ private void tbarHeading_Scroll(object sender, EventArgs e)
+ {
+ //Heading.Text = "Heading: " + (headingTrue*ToDegrees).ToString() + "°";
+ }
+
+ private void btnRemoteAutoSteer_Click(object sender, EventArgs e)
+ {
+ if (steerSwitch > 0) steerSwitch = 0;
+ else steerSwitch = 1;
+ }
+
+ private void btnWorkSwitch_Click(object sender, EventArgs e)
+ {
+ if (workSwitch > 0) workSwitch = 0;
+ else workSwitch = 1;
+ }
+
+
+ public void TimedMessageBox(int timeout, string title, string message)
+ {
+ var form = new FormTimedMessage(timeout, title, message);
+ form.Show();
+ }
+
+ public void YesMessageBox(string s1)
+ {
+ var form = new FormYes(s1);
+ form.ShowDialog(this);
+ }
+
+ private ToolStripDropDownButton toolStripDropDownButton1;
+ private ToolStripMenuItem deviceManagerToolStripMenuItem;
+ }
+}
+
+
diff --git a/Source/Forms/FormGPSData.Designer.cs b/Source/Forms/FormGPSData.Designer.cs
new file mode 100644
index 0000000..526f7bf
--- /dev/null
+++ b/Source/Forms/FormGPSData.Designer.cs
@@ -0,0 +1,778 @@
+namespace AgTwo
+{
+ partial class FormGPSData
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.lblFixQuality = new System.Windows.Forms.Label();
+ this.lblSatsTracked = new System.Windows.Forms.Label();
+ this.lblAltitude = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.lblHDOP = new System.Windows.Forms.Label();
+ this.label17 = new System.Windows.Forms.Label();
+ this.lblSpeed = new System.Windows.Forms.Label();
+ this.lblRoll = new System.Windows.Forms.Label();
+ this.label15 = new System.Windows.Forms.Label();
+ this.lblGPSHeading = new System.Windows.Forms.Label();
+ this.label16 = new System.Windows.Forms.Label();
+ this.label29 = new System.Windows.Forms.Label();
+ this.label19 = new System.Windows.Forms.Label();
+ this.label11 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.label30 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.lblLongitude = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.lblLatitude = new System.Windows.Forms.Label();
+ this.tboxVTG = new System.Windows.Forms.TextBox();
+ this.tboxGGA = new System.Windows.Forms.TextBox();
+ this.tboxHDT = new System.Windows.Forms.TextBox();
+ this.tboxAVR = new System.Windows.Forms.TextBox();
+ this.tboxPAOGI = new System.Windows.Forms.TextBox();
+ this.tboxHPD = new System.Windows.Forms.TextBox();
+ this.lblDualHeading = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.lblAge = new System.Windows.Forms.Label();
+ this.label12 = new System.Windows.Forms.Label();
+ this.tboxPANDA = new System.Windows.Forms.TextBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.lblIMUYawRate = new System.Windows.Forms.Label();
+ this.label14 = new System.Windows.Forms.Label();
+ this.lblIMUPitch = new System.Windows.Forms.Label();
+ this.label20 = new System.Windows.Forms.Label();
+ this.lblIMUHeading = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.lblIMURoll = new System.Windows.Forms.Label();
+ this.tboxKSXT = new System.Windows.Forms.TextBox();
+ this.label13 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 250;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.ForeColor = System.Drawing.Color.Black;
+ this.label2.Location = new System.Drawing.Point(2, 79);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(52, 18);
+ this.label2.TabIndex = 8;
+ this.label2.Text = "Quality";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.ForeColor = System.Drawing.Color.Black;
+ this.label3.Location = new System.Drawing.Point(180, 30);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(52, 18);
+ this.label3.TabIndex = 9;
+ this.label3.Text = "# Sats";
+ //
+ // lblFixQuality
+ //
+ this.lblFixQuality.AutoSize = true;
+ this.lblFixQuality.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblFixQuality.Location = new System.Drawing.Point(52, 79);
+ this.lblFixQuality.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblFixQuality.Name = "lblFixQuality";
+ this.lblFixQuality.Size = new System.Drawing.Size(66, 18);
+ this.lblFixQuality.TabIndex = 2;
+ this.lblFixQuality.Text = "FixQual";
+ this.lblFixQuality.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lblSatsTracked
+ //
+ this.lblSatsTracked.AutoSize = true;
+ this.lblSatsTracked.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSatsTracked.Location = new System.Drawing.Point(231, 31);
+ this.lblSatsTracked.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblSatsTracked.Name = "lblSatsTracked";
+ this.lblSatsTracked.Size = new System.Drawing.Size(41, 18);
+ this.lblSatsTracked.TabIndex = 4;
+ this.lblSatsTracked.Text = "Sats";
+ this.lblSatsTracked.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lblAltitude
+ //
+ this.lblAltitude.AutoSize = true;
+ this.lblAltitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblAltitude.Location = new System.Drawing.Point(231, 55);
+ this.lblAltitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblAltitude.Name = "lblAltitude";
+ this.lblAltitude.Size = new System.Drawing.Size(67, 18);
+ this.lblAltitude.TabIndex = 14;
+ this.lblAltitude.Text = "Altitude";
+ this.lblAltitude.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label8.ForeColor = System.Drawing.Color.Black;
+ this.label8.Location = new System.Drawing.Point(198, 54);
+ this.label8.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(34, 18);
+ this.label8.TabIndex = 16;
+ this.label8.Text = "Elev";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label9.ForeColor = System.Drawing.Color.Black;
+ this.label9.Location = new System.Drawing.Point(185, 6);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(47, 18);
+ this.label9.TabIndex = 18;
+ this.label9.Text = "HDOP";
+ //
+ // lblHDOP
+ //
+ this.lblHDOP.AutoSize = true;
+ this.lblHDOP.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblHDOP.Location = new System.Drawing.Point(231, 7);
+ this.lblHDOP.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblHDOP.Name = "lblHDOP";
+ this.lblHDOP.Size = new System.Drawing.Size(52, 18);
+ this.lblHDOP.TabIndex = 17;
+ this.lblHDOP.Text = "HDOP";
+ this.lblHDOP.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label17.ForeColor = System.Drawing.Color.Black;
+ this.label17.Location = new System.Drawing.Point(6, 55);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(48, 18);
+ this.label17.TabIndex = 116;
+ this.label17.Text = "Speed";
+ //
+ // lblSpeed
+ //
+ this.lblSpeed.AutoSize = true;
+ this.lblSpeed.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSpeed.Location = new System.Drawing.Point(52, 55);
+ this.lblSpeed.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblSpeed.Name = "lblSpeed";
+ this.lblSpeed.Size = new System.Drawing.Size(54, 18);
+ this.lblSpeed.TabIndex = 115;
+ this.lblSpeed.Text = "Speed";
+ this.lblSpeed.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lblRoll
+ //
+ this.lblRoll.AutoSize = true;
+ this.lblRoll.BackColor = System.Drawing.Color.Transparent;
+ this.lblRoll.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblRoll.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblRoll.Location = new System.Drawing.Point(356, 55);
+ this.lblRoll.Name = "lblRoll";
+ this.lblRoll.Size = new System.Drawing.Size(49, 18);
+ this.lblRoll.TabIndex = 463;
+ this.lblRoll.Text = "-11.2";
+ this.lblRoll.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.BackColor = System.Drawing.Color.Transparent;
+ this.label15.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label15.ForeColor = System.Drawing.Color.Black;
+ this.label15.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label15.Location = new System.Drawing.Point(448, 31);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(29, 18);
+ this.label15.TabIndex = 460;
+ this.label15.Text = "Roll";
+ //
+ // lblGPSHeading
+ //
+ this.lblGPSHeading.AutoSize = true;
+ this.lblGPSHeading.BackColor = System.Drawing.Color.Transparent;
+ this.lblGPSHeading.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblGPSHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblGPSHeading.Location = new System.Drawing.Point(356, 6);
+ this.lblGPSHeading.Name = "lblGPSHeading";
+ this.lblGPSHeading.Size = new System.Drawing.Size(54, 19);
+ this.lblGPSHeading.TabIndex = 462;
+ this.lblGPSHeading.Text = "359.3";
+ this.lblGPSHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.BackColor = System.Drawing.Color.Transparent;
+ this.label16.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label16.ForeColor = System.Drawing.Color.Black;
+ this.label16.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label16.Location = new System.Drawing.Point(317, 6);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(40, 19);
+ this.label16.TabIndex = 458;
+ this.label16.Text = "VTG";
+ //
+ // label29
+ //
+ this.label29.AutoSize = true;
+ this.label29.BackColor = System.Drawing.Color.Transparent;
+ this.label29.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label29.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label29.Location = new System.Drawing.Point(4, 267);
+ this.label29.Name = "label29";
+ this.label29.Size = new System.Drawing.Size(30, 13);
+ this.label29.TabIndex = 496;
+ this.label29.Text = "AVR";
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.BackColor = System.Drawing.Color.Transparent;
+ this.label19.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label19.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label19.Location = new System.Drawing.Point(3, 112);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(31, 13);
+ this.label19.TabIndex = 501;
+ this.label19.Text = "GGA";
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.BackColor = System.Drawing.Color.Transparent;
+ this.label11.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label11.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label11.Location = new System.Drawing.Point(5, 205);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(28, 13);
+ this.label11.TabIndex = 502;
+ this.label11.Text = "OGI";
+ //
+ // label26
+ //
+ this.label26.AutoSize = true;
+ this.label26.BackColor = System.Drawing.Color.Transparent;
+ this.label26.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label26.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label26.Location = new System.Drawing.Point(5, 143);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(29, 13);
+ this.label26.TabIndex = 503;
+ this.label26.Text = "VTG";
+ //
+ // label30
+ //
+ this.label30.AutoSize = true;
+ this.label30.BackColor = System.Drawing.Color.Transparent;
+ this.label30.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label30.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label30.Location = new System.Drawing.Point(4, 236);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(30, 13);
+ this.label30.TabIndex = 505;
+ this.label30.Text = "HDT";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label4.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label4.Location = new System.Drawing.Point(4, 297);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(30, 13);
+ this.label4.TabIndex = 509;
+ this.label4.Text = "HPD";
+ //
+ // lblLongitude
+ //
+ this.lblLongitude.AutoSize = true;
+ this.lblLongitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblLongitude.Location = new System.Drawing.Point(36, 5);
+ this.lblLongitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblLongitude.Name = "lblLongitude";
+ this.lblLongitude.Size = new System.Drawing.Size(82, 18);
+ this.lblLongitude.TabIndex = 13;
+ this.lblLongitude.Text = "Longitude";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label7.ForeColor = System.Drawing.Color.Black;
+ this.label7.Location = new System.Drawing.Point(6, 5);
+ this.label7.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(31, 18);
+ this.label7.TabIndex = 15;
+ this.label7.Text = "Lon";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label6.ForeColor = System.Drawing.Color.Black;
+ this.label6.Location = new System.Drawing.Point(9, 29);
+ this.label6.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(28, 18);
+ this.label6.TabIndex = 5;
+ this.label6.Text = "Lat";
+ //
+ // lblLatitude
+ //
+ this.lblLatitude.AutoSize = true;
+ this.lblLatitude.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblLatitude.Location = new System.Drawing.Point(36, 29);
+ this.lblLatitude.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblLatitude.Name = "lblLatitude";
+ this.lblLatitude.Size = new System.Drawing.Size(70, 18);
+ this.lblLatitude.TabIndex = 12;
+ this.lblLatitude.Text = "Latitude";
+ //
+ // tboxVTG
+ //
+ this.tboxVTG.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxVTG.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxVTG.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxVTG.Location = new System.Drawing.Point(35, 139);
+ this.tboxVTG.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxVTG.Name = "tboxVTG";
+ this.tboxVTG.ReadOnly = true;
+ this.tboxVTG.Size = new System.Drawing.Size(398, 21);
+ this.tboxVTG.TabIndex = 497;
+ this.tboxVTG.Text = "$GPVTG,0,T,034.4,M,1,N,1.852,K";
+ //
+ // tboxGGA
+ //
+ this.tboxGGA.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxGGA.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxGGA.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxGGA.Location = new System.Drawing.Point(35, 108);
+ this.tboxGGA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxGGA.Name = "tboxGGA";
+ this.tboxGGA.ReadOnly = true;
+ this.tboxGGA.Size = new System.Drawing.Size(493, 21);
+ this.tboxGGA.TabIndex = 498;
+ this.tboxGGA.Text = "$GPGGA,055129.00,5326.1729618,N,111,09.6028200,W,4,12,0.9,300,M,46.9,M,,,";
+ //
+ // tboxHDT
+ //
+ this.tboxHDT.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxHDT.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxHDT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxHDT.Location = new System.Drawing.Point(35, 232);
+ this.tboxHDT.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxHDT.Name = "tboxHDT";
+ this.tboxHDT.ReadOnly = true;
+ this.tboxHDT.Size = new System.Drawing.Size(398, 21);
+ this.tboxHDT.TabIndex = 499;
+ this.tboxHDT.Text = "$GNHDT,123.456,T * 00";
+ //
+ // tboxAVR
+ //
+ this.tboxAVR.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxAVR.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxAVR.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxAVR.Location = new System.Drawing.Point(35, 263);
+ this.tboxAVR.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxAVR.Name = "tboxAVR";
+ this.tboxAVR.ReadOnly = true;
+ this.tboxAVR.Size = new System.Drawing.Size(493, 21);
+ this.tboxAVR.TabIndex = 500;
+ this.tboxAVR.Text = "$PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03";
+ //
+ // tboxPAOGI
+ //
+ this.tboxPAOGI.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxPAOGI.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxPAOGI.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxPAOGI.Location = new System.Drawing.Point(35, 201);
+ this.tboxPAOGI.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxPAOGI.Name = "tboxPAOGI";
+ this.tboxPAOGI.ReadOnly = true;
+ this.tboxPAOGI.Size = new System.Drawing.Size(493, 21);
+ this.tboxPAOGI.TabIndex = 504;
+ this.tboxPAOGI.Text = "$PAOGI,055129.00,5326.1729618,N,111,09.6028200,W,4,12,0.9,300,M,46.9,M,,,";
+ //
+ // tboxHPD
+ //
+ this.tboxHPD.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxHPD.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxHPD.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxHPD.Location = new System.Drawing.Point(35, 294);
+ this.tboxHPD.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxHPD.Name = "tboxHPD";
+ this.tboxHPD.ReadOnly = true;
+ this.tboxHPD.Size = new System.Drawing.Size(493, 21);
+ this.tboxHPD.TabIndex = 510;
+ this.tboxHPD.Text = "$PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03";
+ //
+ // lblDualHeading
+ //
+ this.lblDualHeading.AutoSize = true;
+ this.lblDualHeading.BackColor = System.Drawing.Color.Transparent;
+ this.lblDualHeading.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblDualHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblDualHeading.Location = new System.Drawing.Point(356, 29);
+ this.lblDualHeading.Name = "lblDualHeading";
+ this.lblDualHeading.Size = new System.Drawing.Size(54, 19);
+ this.lblDualHeading.TabIndex = 514;
+ this.lblDualHeading.Text = "359.3";
+ this.lblDualHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.BackColor = System.Drawing.Color.Transparent;
+ this.label10.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label10.ForeColor = System.Drawing.Color.Black;
+ this.label10.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label10.Location = new System.Drawing.Point(316, 29);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(41, 19);
+ this.label10.TabIndex = 513;
+ this.label10.Text = "Dual";
+ //
+ // lblAge
+ //
+ this.lblAge.AutoSize = true;
+ this.lblAge.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblAge.Location = new System.Drawing.Point(231, 79);
+ this.lblAge.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lblAge.Name = "lblAge";
+ this.lblAge.Size = new System.Drawing.Size(67, 18);
+ this.lblAge.TabIndex = 515;
+ this.lblAge.Text = "Altitude";
+ this.lblAge.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label12.ForeColor = System.Drawing.Color.Black;
+ this.label12.Location = new System.Drawing.Point(199, 78);
+ this.label12.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(33, 18);
+ this.label12.TabIndex = 516;
+ this.label12.Text = "Age";
+ //
+ // tboxPANDA
+ //
+ this.tboxPANDA.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxPANDA.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxPANDA.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxPANDA.Location = new System.Drawing.Point(36, 170);
+ this.tboxPANDA.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxPANDA.Name = "tboxPANDA";
+ this.tboxPANDA.ReadOnly = true;
+ this.tboxPANDA.Size = new System.Drawing.Size(493, 21);
+ this.tboxPANDA.TabIndex = 518;
+ this.tboxPANDA.Text = "$PANDA,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.BackColor = System.Drawing.Color.Transparent;
+ this.label5.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label5.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label5.Location = new System.Drawing.Point(5, 173);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(30, 13);
+ this.label5.TabIndex = 517;
+ this.label5.Text = "NDA";
+ //
+ // lblIMUYawRate
+ //
+ this.lblIMUYawRate.AutoSize = true;
+ this.lblIMUYawRate.BackColor = System.Drawing.Color.Transparent;
+ this.lblIMUYawRate.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblIMUYawRate.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblIMUYawRate.Location = new System.Drawing.Point(475, 77);
+ this.lblIMUYawRate.Name = "lblIMUYawRate";
+ this.lblIMUYawRate.Size = new System.Drawing.Size(49, 18);
+ this.lblIMUYawRate.TabIndex = 520;
+ this.lblIMUYawRate.Text = "-11.2";
+ this.lblIMUYawRate.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label14
+ //
+ this.label14.AutoSize = true;
+ this.label14.BackColor = System.Drawing.Color.Transparent;
+ this.label14.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label14.ForeColor = System.Drawing.Color.Black;
+ this.label14.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label14.Location = new System.Drawing.Point(413, 77);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(66, 18);
+ this.label14.TabIndex = 519;
+ this.label14.Text = "YawRate";
+ //
+ // lblIMUPitch
+ //
+ this.lblIMUPitch.AutoSize = true;
+ this.lblIMUPitch.BackColor = System.Drawing.Color.Transparent;
+ this.lblIMUPitch.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblIMUPitch.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblIMUPitch.Location = new System.Drawing.Point(475, 54);
+ this.lblIMUPitch.Name = "lblIMUPitch";
+ this.lblIMUPitch.Size = new System.Drawing.Size(49, 18);
+ this.lblIMUPitch.TabIndex = 522;
+ this.lblIMUPitch.Text = "-11.2";
+ this.lblIMUPitch.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.BackColor = System.Drawing.Color.Transparent;
+ this.label20.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label20.ForeColor = System.Drawing.Color.Black;
+ this.label20.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label20.Location = new System.Drawing.Point(443, 54);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(38, 18);
+ this.label20.TabIndex = 521;
+ this.label20.Text = "Pitch";
+ //
+ // lblIMUHeading
+ //
+ this.lblIMUHeading.AutoSize = true;
+ this.lblIMUHeading.BackColor = System.Drawing.Color.Transparent;
+ this.lblIMUHeading.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblIMUHeading.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblIMUHeading.Location = new System.Drawing.Point(475, 8);
+ this.lblIMUHeading.Name = "lblIMUHeading";
+ this.lblIMUHeading.Size = new System.Drawing.Size(49, 18);
+ this.lblIMUHeading.TabIndex = 524;
+ this.lblIMUHeading.Text = "-11.2";
+ this.lblIMUHeading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label22
+ //
+ this.label22.AutoSize = true;
+ this.label22.BackColor = System.Drawing.Color.Transparent;
+ this.label22.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label22.ForeColor = System.Drawing.Color.Black;
+ this.label22.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label22.Location = new System.Drawing.Point(443, 8);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(36, 18);
+ this.label22.TabIndex = 523;
+ this.label22.Text = "Yaw";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.ForeColor = System.Drawing.Color.Black;
+ this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label1.Location = new System.Drawing.Point(328, 55);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(29, 18);
+ this.label1.TabIndex = 525;
+ this.label1.Text = "Roll";
+ //
+ // lblIMURoll
+ //
+ this.lblIMURoll.AutoSize = true;
+ this.lblIMURoll.BackColor = System.Drawing.Color.Transparent;
+ this.lblIMURoll.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblIMURoll.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.lblIMURoll.Location = new System.Drawing.Point(475, 31);
+ this.lblIMURoll.Name = "lblIMURoll";
+ this.lblIMURoll.Size = new System.Drawing.Size(49, 18);
+ this.lblIMURoll.TabIndex = 526;
+ this.lblIMURoll.Text = "-11.2";
+ this.lblIMURoll.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // tboxKSXT
+ //
+ this.tboxKSXT.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tboxKSXT.BackColor = System.Drawing.SystemColors.Window;
+ this.tboxKSXT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tboxKSXT.Location = new System.Drawing.Point(35, 327);
+ this.tboxKSXT.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.tboxKSXT.Name = "tboxKSXT";
+ this.tboxKSXT.ReadOnly = true;
+ this.tboxKSXT.Size = new System.Drawing.Size(493, 21);
+ this.tboxKSXT.TabIndex = 528;
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.BackColor = System.Drawing.Color.Transparent;
+ this.label13.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label13.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label13.Location = new System.Drawing.Point(4, 330);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(28, 13);
+ this.label13.TabIndex = 527;
+ this.label13.Text = "SXT";
+ //
+ // FormGPSData
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.ClientSize = new System.Drawing.Size(541, 357);
+ this.Controls.Add(this.tboxKSXT);
+ this.Controls.Add(this.label13);
+ this.Controls.Add(this.lblIMURoll);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.lblIMUHeading);
+ this.Controls.Add(this.label22);
+ this.Controls.Add(this.lblIMUPitch);
+ this.Controls.Add(this.label20);
+ this.Controls.Add(this.lblIMUYawRate);
+ this.Controls.Add(this.label14);
+ this.Controls.Add(this.tboxPANDA);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.lblAge);
+ this.Controls.Add(this.label12);
+ this.Controls.Add(this.lblDualHeading);
+ this.Controls.Add(this.label10);
+ this.Controls.Add(this.tboxHPD);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.lblLatitude);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.tboxPAOGI);
+ this.Controls.Add(this.label7);
+ this.Controls.Add(this.tboxAVR);
+ this.Controls.Add(this.lblLongitude);
+ this.Controls.Add(this.tboxHDT);
+ this.Controls.Add(this.tboxGGA);
+ this.Controls.Add(this.tboxVTG);
+ this.Controls.Add(this.label30);
+ this.Controls.Add(this.label26);
+ this.Controls.Add(this.label11);
+ this.Controls.Add(this.label19);
+ this.Controls.Add(this.label29);
+ this.Controls.Add(this.lblRoll);
+ this.Controls.Add(this.label15);
+ this.Controls.Add(this.lblGPSHeading);
+ this.Controls.Add(this.label17);
+ this.Controls.Add(this.lblSpeed);
+ this.Controls.Add(this.label9);
+ this.Controls.Add(this.lblHDOP);
+ this.Controls.Add(this.lblAltitude);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.lblSatsTracked);
+ this.Controls.Add(this.lblFixQuality);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label16);
+ this.Controls.Add(this.label8);
+ this.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FormGPSData";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "System Data";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormGPSData_FormClosing);
+ this.Load += new System.EventHandler(this.FormGPSData_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label lblFixQuality;
+ private System.Windows.Forms.Label lblSatsTracked;
+ private System.Windows.Forms.Label lblAltitude;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label lblHDOP;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Label lblSpeed;
+ private System.Windows.Forms.Label lblRoll;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.Label lblGPSHeading;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label29;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label30;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label lblLongitude;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label lblLatitude;
+ private System.Windows.Forms.TextBox tboxVTG;
+ private System.Windows.Forms.TextBox tboxGGA;
+ private System.Windows.Forms.TextBox tboxHDT;
+ private System.Windows.Forms.TextBox tboxAVR;
+ private System.Windows.Forms.TextBox tboxPAOGI;
+ private System.Windows.Forms.TextBox tboxHPD;
+ private System.Windows.Forms.Label lblDualHeading;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.Label lblAge;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.TextBox tboxPANDA;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label lblIMUYawRate;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Label lblIMUPitch;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.Label lblIMUHeading;
+ private System.Windows.Forms.Label label22;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lblIMURoll;
+ private System.Windows.Forms.TextBox tboxKSXT;
+ private System.Windows.Forms.Label label13;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormGPSData.cs b/Source/Forms/FormGPSData.cs
new file mode 100644
index 0000000..ae83244
--- /dev/null
+++ b/Source/Forms/FormGPSData.cs
@@ -0,0 +1,69 @@
+//Please, if you use this give me some credit
+//Copyright BrianTee, copy right out of it.
+
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormGPSData : Form
+ {
+ private readonly FormLoop mf = null;
+
+ public FormGPSData(Form callingForm)
+ {
+ mf = callingForm as FormLoop;
+ InitializeComponent();
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ //lblLatitude.Text = mf.latitude.ToString("N7");
+ //lblLongitude.Text = mf.longitude.ToString("N7");
+
+ ////other sat and GPS info
+ //lblFixQuality.Text = mf.FixQuality;
+ //lblSatsTracked.Text = mf.satellitesData.ToString();
+ //lblHDOP.Text = mf.hdopData.ToString();
+ //lblSpeed.Text = mf.speedData.ToString("N1");
+
+ //lblRoll.Text = mf.rollData.ToString("N2");
+ //lblIMURoll.Text = mf.imuRollData.ToString();
+ //lblIMUPitch.Text = mf.imuPitchData.ToString();
+ //lblIMUYawRate.Text = mf.imuYawRateData.ToString();
+ //lblIMUHeading.Text = mf.imuHeadingData.ToString();
+
+ //lblAge.Text = mf.ageData.ToString("N1");
+
+ //lblGPSHeading.Text = mf.headingTrueData.ToString("N2");
+ //lblDualHeading.Text = mf.headingTrueDualData.ToString("N2");
+
+ //lblAltitude.Text = mf.altitudeData.ToString("N1");
+
+ //tboxVTG.Text = mf.vtgSentence;
+ //tboxGGA.Text = mf.ggaSentence;
+ //tboxPAOGI.Text = mf.paogiSentence;
+ //tboxAVR.Text = mf.avrSentence;
+ //tboxHDT.Text = mf.hdtSentence;
+ //tboxHPD.Text = mf.hpdSentence;
+ //tboxPANDA.Text = mf.pandaSentence;
+ //tboxKSXT.Text = mf.ksxtSentence;
+ }
+
+ private void FormGPSData_Load(object sender, EventArgs e)
+ {
+ tboxGGA.Text = "";
+ tboxVTG.Text = "";
+ tboxHDT.Text = "";
+ tboxAVR.Text = "";
+ tboxPAOGI.Text = "";
+ tboxHPD.Text = "";
+ tboxPANDA.Text = "";
+ tboxKSXT.Text = "";
+ }
+
+ private void FormGPSData_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormGPSData.resx b/Source/Forms/FormGPSData.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/Source/Forms/FormGPSData.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormLoop.Designer.cs b/Source/Forms/FormLoop.Designer.cs
new file mode 100644
index 0000000..dd1b638
--- /dev/null
+++ b/Source/Forms/FormLoop.Designer.cs
@@ -0,0 +1,659 @@
+
+namespace AgTwo
+{
+ partial class FormLoop
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLoop));
+ this.label6 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.lblCurentLon = new System.Windows.Forms.Label();
+ this.lblCurrentLat = new System.Windows.Forms.Label();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();
+ this.toolStripEthernet = new System.Windows.Forms.ToolStripMenuItem();
+ this.deviceManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.lblIP = new System.Windows.Forms.Label();
+ this.lblWASCounts = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.lblSwitchStatus = new System.Windows.Forms.Label();
+ this.lblWorkSwitchStatus = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.lbl1To8 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.lbl9To16 = new System.Windows.Forms.Label();
+ this.label12 = new System.Windows.Forms.Label();
+ this.btnExit = new System.Windows.Forms.Button();
+ this.btnRemoteAutoSteer = new System.Windows.Forms.Button();
+ this.btnWorkSwitch = new System.Windows.Forms.Button();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.cboxKSXT = new System.Windows.Forms.CheckBox();
+ this.cboxNDA = new System.Windows.Forms.CheckBox();
+ this.lblWAS = new System.Windows.Forms.Label();
+ this.tbarSteerAngleWAS = new System.Windows.Forms.TrackBar();
+ this.Heading = new System.Windows.Forms.Label();
+ this.cboxOGI = new System.Windows.Forms.CheckBox();
+ this.cboxRMC = new System.Windows.Forms.CheckBox();
+ this.cboxGGA = new System.Windows.Forms.CheckBox();
+ this.Kmh = new System.Windows.Forms.Label();
+ this.mSec = new System.Windows.Forms.Label();
+ this.cboxHDT = new System.Windows.Forms.CheckBox();
+ this.cboxAVR = new System.Windows.Forms.CheckBox();
+ this.cboxVTG = new System.Windows.Forms.CheckBox();
+ this.tbarSpeed = new System.Windows.Forms.TrackBar();
+ this.simTimer = new System.Windows.Forms.Timer(this.components);
+ this.statusStrip1.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tbarSteerAngleWAS)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.tbarSpeed)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label6
+ //
+ this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label6.ForeColor = System.Drawing.Color.Black;
+ this.label6.Location = new System.Drawing.Point(478, 330);
+ this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(24, 16);
+ this.label6.TabIndex = 151;
+ this.label6.Text = "Lat";
+ //
+ // label8
+ //
+ this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label8.ForeColor = System.Drawing.Color.Black;
+ this.label8.Location = new System.Drawing.Point(475, 352);
+ this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(27, 16);
+ this.label8.TabIndex = 152;
+ this.label8.Text = "Lon";
+ //
+ // lblCurentLon
+ //
+ this.lblCurentLon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblCurentLon.AutoSize = true;
+ this.lblCurentLon.BackColor = System.Drawing.Color.Transparent;
+ this.lblCurentLon.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblCurentLon.ForeColor = System.Drawing.Color.Black;
+ this.lblCurentLon.Location = new System.Drawing.Point(502, 351);
+ this.lblCurentLon.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblCurentLon.Name = "lblCurentLon";
+ this.lblCurentLon.Size = new System.Drawing.Size(119, 18);
+ this.lblCurentLon.TabIndex = 154;
+ this.lblCurentLon.Text = "-888.8888888";
+ //
+ // lblCurrentLat
+ //
+ this.lblCurrentLat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblCurrentLat.AutoSize = true;
+ this.lblCurrentLat.BackColor = System.Drawing.Color.Transparent;
+ this.lblCurrentLat.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblCurrentLat.ForeColor = System.Drawing.Color.Black;
+ this.lblCurrentLat.Location = new System.Drawing.Point(502, 329);
+ this.lblCurrentLat.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblCurrentLat.Name = "lblCurrentLat";
+ this.lblCurrentLat.Size = new System.Drawing.Size(109, 18);
+ this.lblCurrentLat.TabIndex = 153;
+ this.lblCurrentLat.Text = "-53.1234567";
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.statusStrip1.AutoSize = false;
+ this.statusStrip1.BackColor = System.Drawing.Color.Transparent;
+ this.statusStrip1.Dock = System.Windows.Forms.DockStyle.None;
+ this.statusStrip1.ImageScalingSize = new System.Drawing.Size(64, 64);
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripDropDownButton1});
+ this.statusStrip1.Location = new System.Drawing.Point(471, 382);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 11, 0);
+ this.statusStrip1.Size = new System.Drawing.Size(106, 70);
+ this.statusStrip1.SizingGrip = false;
+ this.statusStrip1.TabIndex = 149;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // toolStripDropDownButton1
+ //
+ this.toolStripDropDownButton1.AutoSize = false;
+ this.toolStripDropDownButton1.BackColor = System.Drawing.Color.Transparent;
+ this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripEthernet,
+ this.deviceManagerToolStripMenuItem});
+ this.toolStripDropDownButton1.Image = global::AgTwo.Properties.Resources.Settings48;
+ this.toolStripDropDownButton1.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
+ this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripDropDownButton1.Name = "toolStripDropDownButton1";
+ this.toolStripDropDownButton1.ShowDropDownArrow = false;
+ this.toolStripDropDownButton1.Size = new System.Drawing.Size(90, 68);
+ //
+ // toolStripEthernet
+ //
+ this.toolStripEthernet.Name = "toolStripEthernet";
+ this.toolStripEthernet.Size = new System.Drawing.Size(296, 70);
+ //
+ // deviceManagerToolStripMenuItem
+ //
+ this.deviceManagerToolStripMenuItem.Font = new System.Drawing.Font("Tahoma", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.deviceManagerToolStripMenuItem.Image = global::AgTwo.Properties.Resources.DeviceManager;
+ this.deviceManagerToolStripMenuItem.Name = "deviceManagerToolStripMenuItem";
+ this.deviceManagerToolStripMenuItem.Size = new System.Drawing.Size(296, 70);
+ this.deviceManagerToolStripMenuItem.Text = "Device Manager";
+ this.deviceManagerToolStripMenuItem.Click += new System.EventHandler(this.deviceManagerToolStripMenuItem_Click);
+ //
+ // lblIP
+ //
+ this.lblIP.BackColor = System.Drawing.Color.Transparent;
+ this.lblIP.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblIP.ForeColor = System.Drawing.Color.Black;
+ this.lblIP.Location = new System.Drawing.Point(8, 4);
+ this.lblIP.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblIP.Name = "lblIP";
+ this.lblIP.Size = new System.Drawing.Size(144, 56);
+ this.lblIP.TabIndex = 464;
+ this.lblIP.Text = "288.288.288.288";
+ this.lblIP.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.lblIP.Click += new System.EventHandler(this.lblIP_Click);
+ //
+ // lblWASCounts
+ //
+ this.lblWASCounts.AutoSize = true;
+ this.lblWASCounts.BackColor = System.Drawing.Color.Transparent;
+ this.lblWASCounts.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblWASCounts.ForeColor = System.Drawing.Color.Black;
+ this.lblWASCounts.Location = new System.Drawing.Point(90, 135);
+ this.lblWASCounts.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblWASCounts.Name = "lblWASCounts";
+ this.lblWASCounts.Size = new System.Drawing.Size(43, 18);
+ this.lblWASCounts.TabIndex = 476;
+ this.lblWASCounts.Text = "Only";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.ForeColor = System.Drawing.Color.Black;
+ this.label3.Location = new System.Drawing.Point(37, 111);
+ this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(56, 19);
+ this.label3.TabIndex = 477;
+ this.label3.Text = "Angle:";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label4.ForeColor = System.Drawing.Color.Black;
+ this.label4.Location = new System.Drawing.Point(29, 134);
+ this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(64, 19);
+ this.label4.TabIndex = 478;
+ this.label4.Text = "Counts:";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.ForeColor = System.Drawing.Color.Black;
+ this.label2.Location = new System.Drawing.Point(29, 169);
+ this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(61, 19);
+ this.label2.TabIndex = 481;
+ this.label2.Text = "Switch:";
+ //
+ // lblSwitchStatus
+ //
+ this.lblSwitchStatus.AutoSize = true;
+ this.lblSwitchStatus.BackColor = System.Drawing.Color.Transparent;
+ this.lblSwitchStatus.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSwitchStatus.ForeColor = System.Drawing.Color.Black;
+ this.lblSwitchStatus.Location = new System.Drawing.Point(90, 170);
+ this.lblSwitchStatus.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblSwitchStatus.Name = "lblSwitchStatus";
+ this.lblSwitchStatus.Size = new System.Drawing.Size(18, 18);
+ this.lblSwitchStatus.TabIndex = 482;
+ this.lblSwitchStatus.Text = "*";
+ //
+ // lblWorkSwitchStatus
+ //
+ this.lblWorkSwitchStatus.AutoSize = true;
+ this.lblWorkSwitchStatus.BackColor = System.Drawing.Color.Transparent;
+ this.lblWorkSwitchStatus.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblWorkSwitchStatus.ForeColor = System.Drawing.Color.Black;
+ this.lblWorkSwitchStatus.Location = new System.Drawing.Point(90, 193);
+ this.lblWorkSwitchStatus.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblWorkSwitchStatus.Name = "lblWorkSwitchStatus";
+ this.lblWorkSwitchStatus.Size = new System.Drawing.Size(18, 18);
+ this.lblWorkSwitchStatus.TabIndex = 484;
+ this.lblWorkSwitchStatus.Text = "*";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.BackColor = System.Drawing.Color.Transparent;
+ this.label9.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label9.ForeColor = System.Drawing.Color.Black;
+ this.label9.Location = new System.Drawing.Point(38, 192);
+ this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(52, 19);
+ this.label9.TabIndex = 483;
+ this.label9.Text = "Work:";
+ //
+ // lbl1To8
+ //
+ this.lbl1To8.AutoSize = true;
+ this.lbl1To8.BackColor = System.Drawing.Color.Transparent;
+ this.lbl1To8.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl1To8.ForeColor = System.Drawing.Color.Black;
+ this.lbl1To8.Location = new System.Drawing.Point(27, 255);
+ this.lbl1To8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbl1To8.Name = "lbl1To8";
+ this.lbl1To8.Size = new System.Drawing.Size(106, 23);
+ this.lbl1To8.TabIndex = 500;
+ this.lbl1To8.Text = "00000000";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.BackColor = System.Drawing.Color.Transparent;
+ this.label10.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label10.ForeColor = System.Drawing.Color.Black;
+ this.label10.Location = new System.Drawing.Point(27, 235);
+ this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(106, 19);
+ this.label10.TabIndex = 499;
+ this.label10.Text = "8 << 1";
+ //
+ // lbl9To16
+ //
+ this.lbl9To16.AutoSize = true;
+ this.lbl9To16.BackColor = System.Drawing.Color.Transparent;
+ this.lbl9To16.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbl9To16.ForeColor = System.Drawing.Color.Black;
+ this.lbl9To16.Location = new System.Drawing.Point(27, 307);
+ this.lbl9To16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbl9To16.Name = "lbl9To16";
+ this.lbl9To16.Size = new System.Drawing.Size(106, 23);
+ this.lbl9To16.TabIndex = 502;
+ this.lbl9To16.Text = "00000000";
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.BackColor = System.Drawing.Color.Transparent;
+ this.label12.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label12.ForeColor = System.Drawing.Color.Black;
+ this.label12.Location = new System.Drawing.Point(27, 286);
+ this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(105, 19);
+ this.label12.TabIndex = 501;
+ this.label12.Text = "16 << 9";
+ //
+ // btnExit
+ //
+ this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnExit.BackColor = System.Drawing.Color.Transparent;
+ this.btnExit.FlatAppearance.BorderColor = System.Drawing.SystemColors.HotTrack;
+ this.btnExit.FlatAppearance.BorderSize = 0;
+ this.btnExit.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnExit.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnExit.ForeColor = System.Drawing.Color.White;
+ this.btnExit.Image = global::AgTwo.Properties.Resources.Cancel64;
+ this.btnExit.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.btnExit.Location = new System.Drawing.Point(583, 389);
+ this.btnExit.Margin = new System.Windows.Forms.Padding(4);
+ this.btnExit.Name = "btnExit";
+ this.btnExit.Size = new System.Drawing.Size(63, 58);
+ this.btnExit.TabIndex = 192;
+ this.btnExit.UseVisualStyleBackColor = false;
+ this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
+ //
+ // btnRemoteAutoSteer
+ //
+ this.btnRemoteAutoSteer.Location = new System.Drawing.Point(29, 29);
+ this.btnRemoteAutoSteer.Name = "btnRemoteAutoSteer";
+ this.btnRemoteAutoSteer.Size = new System.Drawing.Size(61, 45);
+ this.btnRemoteAutoSteer.TabIndex = 514;
+ this.btnRemoteAutoSteer.Text = "Steer";
+ this.btnRemoteAutoSteer.UseVisualStyleBackColor = true;
+ this.btnRemoteAutoSteer.Click += new System.EventHandler(this.btnRemoteAutoSteer_Click);
+ //
+ // btnWorkSwitch
+ //
+ this.btnWorkSwitch.Location = new System.Drawing.Point(113, 29);
+ this.btnWorkSwitch.Name = "btnWorkSwitch";
+ this.btnWorkSwitch.Size = new System.Drawing.Size(55, 45);
+ this.btnWorkSwitch.TabIndex = 515;
+ this.btnWorkSwitch.Text = "Work";
+ this.btnWorkSwitch.UseVisualStyleBackColor = true;
+ this.btnWorkSwitch.Click += new System.EventHandler(this.btnWorkSwitch_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.btnRemoteAutoSteer);
+ this.groupBox1.Controls.Add(this.btnWorkSwitch);
+ this.groupBox1.Controls.Add(this.label9);
+ this.groupBox1.Controls.Add(this.label12);
+ this.groupBox1.Controls.Add(this.label3);
+ this.groupBox1.Controls.Add(this.label4);
+ this.groupBox1.Controls.Add(this.lblWASCounts);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.lblSwitchStatus);
+ this.groupBox1.Controls.Add(this.lblWorkSwitchStatus);
+ this.groupBox1.Controls.Add(this.label10);
+ this.groupBox1.Controls.Add(this.lbl1To8);
+ this.groupBox1.Controls.Add(this.lbl9To16);
+ this.groupBox1.Location = new System.Drawing.Point(223, 9);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(183, 359);
+ this.groupBox1.TabIndex = 516;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Steer Module";
+ //
+ // cboxKSXT
+ //
+ this.cboxKSXT.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxKSXT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxKSXT.Location = new System.Drawing.Point(562, 288);
+ this.cboxKSXT.Name = "cboxKSXT";
+ this.cboxKSXT.Size = new System.Drawing.Size(80, 24);
+ this.cboxKSXT.TabIndex = 537;
+ this.cboxKSXT.Text = "KSXT";
+ this.cboxKSXT.UseVisualStyleBackColor = true;
+ //
+ // cboxNDA
+ //
+ this.cboxNDA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxNDA.Checked = true;
+ this.cboxNDA.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.cboxNDA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxNDA.Location = new System.Drawing.Point(460, 288);
+ this.cboxNDA.Name = "cboxNDA";
+ this.cboxNDA.Size = new System.Drawing.Size(69, 24);
+ this.cboxNDA.TabIndex = 536;
+ this.cboxNDA.Text = "NDA";
+ this.cboxNDA.UseVisualStyleBackColor = true;
+ //
+ // lblWAS
+ //
+ this.lblWAS.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.lblWAS.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.lblWAS.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblWAS.Location = new System.Drawing.Point(424, 21);
+ this.lblWAS.Name = "lblWAS";
+ this.lblWAS.Size = new System.Drawing.Size(206, 26);
+ this.lblWAS.TabIndex = 535;
+ this.lblWAS.Text = "Steer Angle: 0°";
+ this.lblWAS.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.lblWAS.Click += new System.EventHandler(this.lblWAS_Click);
+ //
+ // tbarSteerAngleWAS
+ //
+ this.tbarSteerAngleWAS.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbarSteerAngleWAS.LargeChange = 1;
+ this.tbarSteerAngleWAS.Location = new System.Drawing.Point(413, 56);
+ this.tbarSteerAngleWAS.Maximum = 6000;
+ this.tbarSteerAngleWAS.Minimum = -6000;
+ this.tbarSteerAngleWAS.Name = "tbarSteerAngleWAS";
+ this.tbarSteerAngleWAS.Size = new System.Drawing.Size(229, 45);
+ this.tbarSteerAngleWAS.TabIndex = 534;
+ this.tbarSteerAngleWAS.TickFrequency = 100;
+ this.tbarSteerAngleWAS.Scroll += new System.EventHandler(this.tbarSteerAngleWAS_Scroll);
+ //
+ // Heading
+ //
+ this.Heading.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.Heading.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Heading.Location = new System.Drawing.Point(464, 99);
+ this.Heading.Name = "Heading";
+ this.Heading.Size = new System.Drawing.Size(127, 20);
+ this.Heading.TabIndex = 524;
+ this.Heading.Text = "Heading: 112°";
+ this.Heading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // cboxOGI
+ //
+ this.cboxOGI.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxOGI.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxOGI.Location = new System.Drawing.Point(460, 260);
+ this.cboxOGI.Name = "cboxOGI";
+ this.cboxOGI.Size = new System.Drawing.Size(69, 24);
+ this.cboxOGI.TabIndex = 532;
+ this.cboxOGI.Text = "OGI";
+ this.cboxOGI.UseVisualStyleBackColor = true;
+ //
+ // cboxRMC
+ //
+ this.cboxRMC.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxRMC.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxRMC.Location = new System.Drawing.Point(562, 259);
+ this.cboxRMC.Name = "cboxRMC";
+ this.cboxRMC.Size = new System.Drawing.Size(69, 24);
+ this.cboxRMC.TabIndex = 531;
+ this.cboxRMC.Text = "RMC";
+ this.cboxRMC.UseVisualStyleBackColor = true;
+ //
+ // cboxGGA
+ //
+ this.cboxGGA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxGGA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxGGA.Location = new System.Drawing.Point(460, 201);
+ this.cboxGGA.Name = "cboxGGA";
+ this.cboxGGA.Size = new System.Drawing.Size(69, 24);
+ this.cboxGGA.TabIndex = 530;
+ this.cboxGGA.Text = "GGA";
+ this.cboxGGA.UseVisualStyleBackColor = true;
+ //
+ // Kmh
+ //
+ this.Kmh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.Kmh.AutoSize = true;
+ this.Kmh.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Kmh.Location = new System.Drawing.Point(421, 132);
+ this.Kmh.Name = "Kmh";
+ this.Kmh.Size = new System.Drawing.Size(79, 20);
+ this.Kmh.TabIndex = 529;
+ this.Kmh.Text = "Kmh: 0.0";
+ //
+ // mSec
+ //
+ this.mSec.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.mSec.AutoSize = true;
+ this.mSec.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.mSec.Location = new System.Drawing.Point(543, 134);
+ this.mSec.Name = "mSec";
+ this.mSec.Size = new System.Drawing.Size(79, 16);
+ this.mSec.TabIndex = 528;
+ this.mSec.Text = "M/Sec: 0.0";
+ //
+ // cboxHDT
+ //
+ this.cboxHDT.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxHDT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxHDT.Location = new System.Drawing.Point(562, 230);
+ this.cboxHDT.Name = "cboxHDT";
+ this.cboxHDT.Size = new System.Drawing.Size(69, 24);
+ this.cboxHDT.TabIndex = 527;
+ this.cboxHDT.Text = "HDT";
+ this.cboxHDT.UseVisualStyleBackColor = true;
+ //
+ // cboxAVR
+ //
+ this.cboxAVR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxAVR.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxAVR.Location = new System.Drawing.Point(562, 201);
+ this.cboxAVR.Name = "cboxAVR";
+ this.cboxAVR.Size = new System.Drawing.Size(69, 24);
+ this.cboxAVR.TabIndex = 526;
+ this.cboxAVR.Text = "AVR";
+ this.cboxAVR.UseVisualStyleBackColor = true;
+ //
+ // cboxVTG
+ //
+ this.cboxVTG.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cboxVTG.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cboxVTG.Location = new System.Drawing.Point(460, 230);
+ this.cboxVTG.Name = "cboxVTG";
+ this.cboxVTG.Size = new System.Drawing.Size(69, 24);
+ this.cboxVTG.TabIndex = 525;
+ this.cboxVTG.Text = "VTG";
+ this.cboxVTG.UseVisualStyleBackColor = true;
+ //
+ // tbarSpeed
+ //
+ this.tbarSpeed.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbarSpeed.LargeChange = 10;
+ this.tbarSpeed.Location = new System.Drawing.Point(414, 151);
+ this.tbarSpeed.Maximum = 500;
+ this.tbarSpeed.Minimum = -200;
+ this.tbarSpeed.Name = "tbarSpeed";
+ this.tbarSpeed.Size = new System.Drawing.Size(229, 45);
+ this.tbarSpeed.TabIndex = 519;
+ this.tbarSpeed.TickFrequency = 50;
+ this.tbarSpeed.Scroll += new System.EventHandler(this.tbarSpeed_Scroll);
+ //
+ // simTimer
+ //
+ this.simTimer.Enabled = true;
+ this.simTimer.Tick += new System.EventHandler(this.simTimer_Tick);
+ //
+ // FormLoop
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.ClientSize = new System.Drawing.Size(654, 455);
+ this.Controls.Add(this.cboxKSXT);
+ this.Controls.Add(this.cboxNDA);
+ this.Controls.Add(this.lblWAS);
+ this.Controls.Add(this.tbarSteerAngleWAS);
+ this.Controls.Add(this.Heading);
+ this.Controls.Add(this.cboxOGI);
+ this.Controls.Add(this.cboxRMC);
+ this.Controls.Add(this.cboxGGA);
+ this.Controls.Add(this.Kmh);
+ this.Controls.Add(this.mSec);
+ this.Controls.Add(this.cboxHDT);
+ this.Controls.Add(this.cboxAVR);
+ this.Controls.Add(this.cboxVTG);
+ this.Controls.Add(this.tbarSpeed);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.label8);
+ this.Controls.Add(this.label6);
+ this.Controls.Add(this.btnExit);
+ this.Controls.Add(this.statusStrip1);
+ this.Controls.Add(this.lblCurentLon);
+ this.Controls.Add(this.lblCurrentLat);
+ this.Controls.Add(this.lblIP);
+ this.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(50, 50);
+ this.Name = "FormLoop";
+ this.Padding = new System.Windows.Forms.Padding(4);
+ this.Text = "AgTwo";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLoop_FormClosing);
+ this.Load += new System.EventHandler(this.FormLoop_Load);
+ this.Resize += new System.EventHandler(this.FormLoop_Resize);
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.tbarSteerAngleWAS)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.tbarSpeed)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label lblCurentLon;
+ private System.Windows.Forms.Label lblCurrentLat;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.Button btnExit;
+ private System.Windows.Forms.Label lblIP;
+ private System.Windows.Forms.Label lblWASCounts;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label lblSwitchStatus;
+ private System.Windows.Forms.Label lblWorkSwitchStatus;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label lbl1To8;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.Label lbl9To16;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.ToolStripMenuItem toolStripEthernet;
+ private System.Windows.Forms.Button btnRemoteAutoSteer;
+ private System.Windows.Forms.Button btnWorkSwitch;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.CheckBox cboxKSXT;
+ private System.Windows.Forms.CheckBox cboxNDA;
+ private System.Windows.Forms.Label lblWAS;
+ private System.Windows.Forms.TrackBar tbarSteerAngleWAS;
+ private System.Windows.Forms.Label Heading;
+ private System.Windows.Forms.CheckBox cboxOGI;
+ private System.Windows.Forms.CheckBox cboxRMC;
+ private System.Windows.Forms.CheckBox cboxGGA;
+ private System.Windows.Forms.Label Kmh;
+ private System.Windows.Forms.Label mSec;
+ private System.Windows.Forms.CheckBox cboxHDT;
+ private System.Windows.Forms.CheckBox cboxAVR;
+ private System.Windows.Forms.CheckBox cboxVTG;
+ private System.Windows.Forms.TrackBar tbarSpeed;
+ private System.Windows.Forms.Timer simTimer;
+ }
+}
+
diff --git a/Source/Forms/FormLoop.cs b/Source/Forms/FormLoop.cs
new file mode 100644
index 0000000..c78beee
--- /dev/null
+++ b/Source/Forms/FormLoop.cs
@@ -0,0 +1,133 @@
+using AgTwo.Properties;
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormLoop : Form
+ {
+ //timer variables
+ public double secondsSinceStart, twoSecondTimer, tenSecondTimer, threeMinuteTimer;
+
+ public string lastSentence;
+
+ public bool isPluginUsed;
+
+ //usually 256 - send ntrip to serial in chunks
+ public int packetSizeNTRIP;
+
+ public bool lastHelloGPS, lastHelloAutoSteer, lastHelloMachine, lastHelloNav;
+ public bool isConnectedNav, isConnectedSteer, isConnectedMachine;
+
+ //is the fly out displayed
+ public bool isViewAdvanced = false;
+
+ //used to hide the window and not update text fields and most counters
+ public bool isAppInFocus = true, isLostFocus;
+ public int focusSkipCounter = 121;
+
+ //The base directory where Drive will be stored and fields and vehicles branch from
+ public string baseDirectory;
+
+
+ public FormLoop()
+ {
+ InitializeComponent();
+ }
+
+ //First run
+ private void FormLoop_Load(object sender, EventArgs e)
+ {
+ if (Settings.Default.setF_workingDirectory == "Default")
+ baseDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\AgOpenGPS\\";
+ else baseDirectory = Settings.Default.setF_workingDirectory + "\\AgOpenGPS\\";
+
+ if (Settings.Default.setUDP_isOn)
+ {
+ LoadUDPNetwork();
+ }
+ else
+ {
+ label2.Visible = false;
+ label3.Visible = false;
+ label4.Visible = false;
+ label9.Visible = false;
+
+ lblWASCounts.Visible = false;
+ lblSwitchStatus.Visible = false;
+ lblWorkSwitchStatus.Visible = false;
+
+ label10.Visible = false;
+ label12.Visible = false;
+ lbl1To8.Visible = false;
+ lbl9To16.Visible = false;
+
+ lblIP.Text = "Off";
+ }
+
+ latitude = 53.4360564;
+ longitude = -111.160047;
+ }
+
+ private void FormLoop_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ Settings.Default.Save();
+
+ if (UDPSocket != null)
+ {
+ try
+ {
+ UDPSocket.Shutdown(SocketShutdown.Both);
+ }
+ finally { UDPSocket.Close(); }
+ }
+ }
+
+ private void FormLoop_Resize(object sender, EventArgs e)
+ {
+ }
+
+
+
+ private void deviceManagerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("devmgmt.msc");
+ }
+
+ private void btnResetTimer_Click(object sender, EventArgs e)
+ {
+ threeMinuteTimer = secondsSinceStart;
+ }
+
+ private void btnRelayTest_Click(object sender, EventArgs e)
+ {
+ helloFromAgIO[7] = 1;
+ }
+
+ private void lblIP_Click(object sender, EventArgs e)
+ {
+ lblIP.Text = "";
+ foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
+ {
+ if (IPA.AddressFamily == AddressFamily.InterNetwork)
+ {
+ _ = IPA.ToString();
+ lblIP.Text += IPA.ToString() + "\r\n";
+ }
+ }
+ }
+
+ private void btnExit_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+ }
+}
+
diff --git a/Source/Forms/FormLoop.resx b/Source/Forms/FormLoop.resx
new file mode 100644
index 0000000..3b06d4f
--- /dev/null
+++ b/Source/Forms/FormLoop.resx
@@ -0,0 +1,1262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 208, 18
+
+
+ 341, 18
+
+
+ 47
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAMMOAADDDgAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAI65gQCOuYEAjrmBAo65gQSOuYEHjrmBCI65gQmOuYEJjrmBCI65gQWOuYEDjrmBAY65
+ gQCOuYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAASY40AEmONABJjjQAR40yAESLLgA+hycAW5pIAIm2fAGNuIAGjrmADo65
+ gRaOuYEcjrmBH465gR6OuYEZjrmBEY25gAqMuH8EiLV6AV6bTABRkz4AVZZCAFaXQwBXl0QAV5dEAFeX
+ RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJjjQASY40AEmO
+ NABHjTIBRIsuAT6HJwI6hSQCa6NaBYOydRCJtnwii7d+NIy4f0GMuH9IjLh/R4y3fjyKt30qh7V5GH+w
+ cAtmoFUES482AlGTPgFVlkIBVpdDAVeXRABXl0QAV5dEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEmONABJjjQASY40AkeNMgRDiy4GPYcnBzeDIAhTlT8OdaplIoKy
+ dEKHtHliibV7eYm2fIWJtnyDiLV6cIWzd099r28wbqVdGFOUPwxJjjQIUZM+B1WWQgVWl0MDV5dEAVeX
+ RABXl0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASY40AEmO
+ NAFJjjQGR40yDkOLLhY9hycbNYIeHj+IKSZfnExAdKlkbH2ubpaBsXO2g7J1xoOxdMOAsHGpeaxpfmyk
+ W1NYl0Q0RYwwI0iNMx1Rkz0ZVZVCEVaWQwpXl0QEV5dEAVeXRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFaWQwBWlkMAVpZDAFaWQwBRkz0ASo81BEmONBFHjTInQ4ouOz2HJ0o0gR1SM4AbWkaM
+ MHNdmkqba6NawnKnYt91qWXvdalk7G+mX9Rkn1KsU5U/hEOLLWc+iChYR40yUFCTPERVlUEvVpZDG1eX
+ RAtZmEYDZ6BVAHOoYgBzqGIAc6hiAHOoYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVpZDAFaWQwBWlkMBVpZDA1WW
+ QgVPkjsPS482KEeNMk5Dii5xPYcnijSBHZUufRaZNoIfp0eNMr5WlkLWX5tM6GOeUfFinVDwW5lI4U+R
+ OslBiSqxOIQhoTuGJJpGjDCUT5I7gFSVQF1Xl0Q4XJpJG2WgUwpxp2ADc6hiAXOoYgBzqGIAc6hiAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABWlkMAVpZDAVaWQwVWlkMMVpZCGFKUPyxNkDlOSI0ze0OKLqE9hye2NYIeui19
+ FbQvfheyPIUluUiNM8NRkjzKVZVBzlSVQM1NkDjHQokrvjeDILc0gRy2OYQivUOKLcJMkDeyUpM+jFiX
+ RWBhnU87a6NaH3KnYQ5zqGIFc6hiAXOoYgBzqGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOUQABTlEACU5RAC1OU
+ QBxTlD83UZM9WU2QOYBIjTOkQ4ouvD2HKMI2gx+1Ln0Wni19FY43gh+LQoksjUqONZBOkTmRTZA4kUaM
+ MY88hiWNNIEckjOAG585hCK3QYkrzkmOM85Rkjy0WZhGjmKeUGZqo1hAbqVdH2+lXQtvpV0Db6VeAW+l
+ XQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACJtHwAibR8AIm0fACJtHwAibR8AIm0fACJtHwAibR8AIm0fACKtH0AirR9AIq0fQCLtX8AjbaBAJG5
+ hQCUu4kAlryLAJe9jACXvYwAl72MAJe9jACXvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAATZE5AE2ROQRNkTkRTZE5LE2ROVZMkDiGSo41rEaMMcBCiizDPYcotjiE
+ IZgwfxlzLX0VWjSBHVI+hyhSRowxUkqPNVJJjjRSQ4otUjqEIlQ0gR1fN4Ifdz6HJ59Fiy/JS4823VKT
+ PdJZl0W3X5tMkWSeUWFmoFMxZqBUEWegVQVnoFUBZ6BVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIm0fACJtHwAibR8AIm0fACJtHwAibR8AYm0
+ fAGJtHwBibR8AYq0fQGKtH0BirR9AYu1fwGNtoEBkbmFAZS7iQGWvIsBl72MAZe9jACXvYwAl72MAJe9
+ jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjC8ARYwvBUWM
+ LxZFjC85RYwvbkWLL6hDiy7IQoosxz+IKrQ9hyeXOYUjcDOBHEcufhcsM4AcJD2GJiJEiy4iSI0zIkeN
+ MiJBiSsiO4UkJj6GJzVGizBUTZA4h1KTPcBUlEDjVpVC5leWQ9RYl0SwWJhEe1mYRT9amEYWW5lHBluZ
+ RwFbmUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAibR8AIm0fACJtHwAibR8AYm0fAKJtHwDibR8BYm0fAWJtHwGirR9Boq0fQaKtH0Gi7V/Bo22
+ gQaRuYUGlLuJBpa8iwWXvYwDl72MAZe9jAGXvYwAl72MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADmEIgA5hCIFOYQiGTmEIkA5hCJ8OYQiuDmEIs46hSO5OoUkkzqF
+ JGw6hSRFOIQhJDOBHBA0gR0JPIYmCESLLgdIjTMHR40yB0KKLAhMkDcMXppLHGegVT9roll3aqJZt2Wf
+ U+JcmUnuVJRA4k2QOMFIjjOIR40xR0eNMRlIjTIHSI0yAUiNMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJtHwAibR8AIm0fAGJtHwCibR8B4m0
+ fA6JtHwTibR8F4m0fBmKtH0ZirR9GYq0fRmLtX8ZjbaBGZG5hRmUu4kXlryLE5e9jAyXvYwGl72MApe9
+ jAGXvYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3wTACt8
+ EwYrfBMaK3wTQit8E38sfBO6LH0Uxi59FZ8wfxhrNIEdQDiEISE6hiQOOoUkBDmEIgE8hiYARIsuAEiN
+ MwBHjTIAXZpKAIe0eAWKtn0Ui7Z+NYu2fmqGs3iod6pn1WKdUOZOkTrgP4gpwzaCHowygBpJMoAaGjKA
+ GgcygBoBMoAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKHBlwChwZcAocGXAKHBlwChwZcAnL6SAJK4hQCBrnIAa6FaAFOT
+ QAA/hykAMX8aACt7EwBSkz4BdahlAoOxdgeHs3oViLN7KYi0ezuJtHtGibR8S4m0fEyJtHxMirR9TIu1
+ fkyNtoBMkLiES5O7iEeVvIo6lryLJpW8iRSRuoYIgbBzAjOBHAAvfhcAQIgqAE+ROwBal0YAYJtNAGOd
+ UQBjnVEAY51RAAAAAAAAAAAAAAAAAAAAAAAjdwkAI3cJBiN3CRojdwlCI3cJfyN3Cbgjdwm9I3cKjCV4
+ C1Eoeg8lLn4WDDmFIwM7hiUBO4YlADuGJQA7hiUAAAAAAAAAAAChxJYAocSWA6HElg+hxJYpoMOVUpe+
+ ioV+r2+wX5tNykWLL9AzgRu8KHoPiiR4C0kkdwoaJHcKByR3CwEkdwsAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAocGXAKHB
+ lwChwZcAocGXAaHBlwOcvpIGkriFCIGucglroVoKU5NACj+HKQoxfxoKKHoQCih6EAo4gyENWpdHFnOn
+ Yy99rW5VgK9ydoGvc4qCsHSTg7B1loOwdZaDsHWWhLF3loayeZaJtHyUjLZ/jIy2gHSItHtPfa1vLWWf
+ VBg8hiUNJXgMCi9+FwpAiCoKT5E7CVqXRgdgm00FY51RAmOdUQBjnVEAAAAAAAAAAAAAAAAAAAAAACB1
+ BgAgdQYGIHUGGiB1BkIgdQZ/IHUGuCB1BrsgdQaHIHUGSiB1Bh4hdgcHKHoQADuGJQA7hiUAO4YlADuG
+ JQAAAAAAAAAAAKjJngCoyZ4CqMmeCajJnhinyJ0wl76LUnOoY3tPkjuiOIQhuSp7ErMjdwmIIHUGSSB1
+ BhogdQYHIHUGASB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAOoQjADqEIwBYlUQAjraCAJm8jgKev5MFn8CVDpu+kRqRt4UkgK1yKmuh
+ WixTkz8tP4cpLTF/Gi0oehAtJHcLLih5DzA5hCI7U5RAWWWeVIVto12rcKVgwnKmYs5zpmPRc6Zj0XOm
+ Y9F0p2TRdqhm0Hiqac95q2vFdqlnqWyjXH5Zl0ZXP4gpPSl6EDEkdwstL34XLUCIKixPkTooWZdGIV+b
+ TRVhnE8KXppMAkWLMABFizAATZA5AFKTPwBVlUIAInYJACB1BgYgdQYaIHUGQiB1Bn8gdQa4IHUGuyB1
+ BocgdQZKIHUGHiF2BwctfRUAcaZgAHGmYABxpmAAcaZgAAAAAAAAAAAAqcmfAKnJnwGpyZ8EqcmfCqbH
+ nBWGs3gqV5dEUTqFI4MsfBOnJXgLqyF2B4YgdQZJIHUGGiB1BgcgdQYBIHUGAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6hCMAOoQjAD2G
+ JwFVlEICbaJcBoOvdQ+Qt4QjkriHPYu0flN7qm1gZ59WZ1CRPWg9hidoMH4ZaCh5D2gjdwppI3cKayp7
+ EnQ6hSSMSo42sFSUQNBYl0XjWphI7VuYSO9cmEjvXJlJ71yZSe9dmkvvX5tN7V+bTeVamEjOTpA6qj2G
+ J4otfRV1I3cKayN3CmgufRZoPocoZkyPOF1VlUJNWZdGNFaVQhpFizAKOoUjBUWLMAVNkDkEUpM/A1WV
+ QgE9hycAIHUGBiB1BhogdQZCIHUGfyB1BrghdQe8InYIiSR3Ck0oeg8hN4MgCWSeUgJxpmAAcaZgAHGm
+ YABxpmAAAAAAAAAAAACawI8AmsCPAJrAjwKawI8Flr2KCmagVRk9hyc/LHwUdSV4DJ8idgmoIXYHhiF1
+ B0khdQcaIXUHByF1BwEhdQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJG3
+ hgCRt4YAkbeGAI61gwCKsn4AgK1yAFGRPQA7hCQBO4UkA0SKLglRkj0SZZ1UI3mpakKCr3RpfqxwiXKl
+ Ypxgmk6lTI43pzqEJKcvfRanJ3kOpyN3CaghdgipJHcLryx8FL42gh/UPYYm6EGJK/RCii36Q4ot/EOK
+ LfxDii38RIou/ESLL/tFizD6RIsv9UCIKuc3gyDQLX0VvCZ4DK8hdgipI3cJpyx8FKc7hSSkR4wymE6R
+ On9PkTpcRowwNjeDIB85hCIYRYswFk2QORJSkz8MVZVCBU2QOQEhdggGIXYHGiF2B0Ihdgd/IXYIuSN3
+ CsAneQ6SL34WWTyGJi1VlUASbqRcBnGmYAJwpl8Ab6VeAGmhVwBjnlEAZJ5SAHOoZAB3q2gBd6toAner
+ aAZ1qWUNWZhGHTuGJUQtfRR5J3kOoSR4C6kjdwmGIncJSSJ3CRojdwkHI3cJASN3CQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkbeGAJG3hgCRt4YAjrWDAIqyfgCArXIBZp5VAT+H
+ KQM6hCMJPYYnF0SKLipQkTxFYZtPa2yiW5ZsoVu5Y5xRzlWUQdhEii/aNoIf2ix8E9omeAzaInYI2yF1
+ B9shdgjeJHgL5Ch6D+4sfBP2Ln0V/C9+Fv4vfhf/L34X/y9+F/8vfhf/MH4X/zB+GP4vfhf8LX0V9il6
+ EOwleAvkInYI3iB1B9sidgnaKnsS2jaCH9dAiCrJRIsur0KJLIk4gyFgMX8ZRziEIj9Eiy85TJA4L1GT
+ Ph9TlEAOTZA5BCR4CwYjdwoaI3cKQiN3Cn8keAu7KHoPyDB/GKM+hydxUJI7RmOdUCZvpV0Qb6VeBWyj
+ WwFpoVcAZJ9SAGOeUQBknlIAZ6BWAG6lXgFvpl8GcKZgD2+mXx5inlA2S482XjmEIowvfhesKnsRrSd6
+ DocmeQ1IJnkNGid5DgcneQ4BJ3kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACRt4YAkbeGAJG3hgCOtYMBirN+AoCtcgNqoFkDRIkuBzmDIhQ5hCMtPIUlT0GIK3VKjTWdUpI+wlOT
+ P91OkDntRIov9TmDIvcvfhf3KHoP9yR3Cvcidgj3IHUG9yB1Bvghdgf5InYI+yJ3Cf0jdwn+I3cK/yN3
+ Cv8jdwr/I3cK/yN3Cv8jdwr/I3cK/yN3Cv4jdwn9InYI+yF2B/kgdQb4IHUG9yJ2CPcneQ73L34X9DWC
+ Huo3gyDVM4EcuC19FJgtfRWEOIMhfESKLnJLjzdeUJI8P1CSPB5IjTMJKnsRCCd5DhomeQ5CJnkOfyl6
+ EL0vfhfVO4Ylv0uPNphbmUhvaKBWRm6kXCFto1sLaaFXA2agVAFjnlEAY55RAGSeUgBln1MBa6JaBG2k
+ XQ1upV4fbqVePGehVmJYl0WLR40xrTuFJL4zgRuzL34Why19FEgtfRUZLX0VBy19FQEtfRUAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJG3hgCRt4YBkbeGA462gweKs34MgK1zEGyh
+ WxNLjjYZOIMhLDWBHk82gh99N4IgqzmDIs86hCPlOYMi8jaBHvoxfxn+K3wT/yd5Dv8kdwr/InYI/yF1
+ B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yN3Cv8neQ79KXsR+Cp7Ee8oeg/hJngN0it7Esg2gh/CQYgrs0eN
+ M5VKjjZpRowyOTqFJBgufRYQLXwVHy18FUQtfBWAL34YwTeDIONEiy7eUpM+xV2aSqBln1JwZ6BVPmaf
+ VBxkn1INY55SBmOeUQJjnlEBZJ5SAWSeUgRln1QMZ6BWHWihVzpooVdlZZ9TllyaSbxQkjvNRIsuyzyG
+ JbI2gx+BNIIdQzSCHRg1gh0GNYIdATWCHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdvJMAnbyTAJ28
+ kwCdvJMAmLqNAJG3hgKRt4UKjrWDGIqzfimArXM5bKFcQk6QOko3giBdMH4Yfy99F6ovfhfULn0W7yt7
+ EvkoeQ/8JngM/iR3Cv8jdgn/InYI/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2
+ CP8idgj+InYI+yJ2CPgidgn1KHoP8zF/Gu45hCPgPocowz6HKJg5hCJnMX8aPy59FisygBstNoIfSjeC
+ IIE5gyLDPoco7EaMMfNOkTrlVZVByFqYR51emktsYJxORGKdTyhinVAVYJxOCVmYRgJdmkoDYp1QDmKd
+ UCJgnE4/XptMZFyaSZNZmEbAVJVB106ROdJGjDC7QIkpmDuGJGg5hSI1OYUiEzmFIgU5hSIBOYUiAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ28kwCdvJMAnbyTAJ28kwGcvJIDlLiJCo61ghuJsn03hK93WHuq
+ bHdon1eJTI84kjaBHp4rexO0KHoQ0Ch5D+oneQ76JXcL/yJ2CP8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAv+K3sS/C9+
+ F/MygBrgMoAaxC9+F6AsfBR4LXwUVjKAG0g7hSVYP4gqh0GJK8VCiS3vRIou+kaMMfNKjjXiT5I7x1aW
+ QqRbmUh8XJlJVFeXRDJLkDcZNIEcDTuFJA9UlEAjW5lIRluYSG5XlkOVUJI8ukqONdNFjDDSQoost0CJ
+ KpA+hydoPIYlQTuGJCA7hiQLO4YkAzuGJAE7hiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnLySAJy8
+ kgCcvJICnLySBZy7kg6VuIoei7J+OYGtdF95qWqJbqNer12ZS8VGizDNMoAb0yh5D90kdwvpJHcK9iN2
+ Cf0idgj/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2CP8leAv+J3kO+Sl6EPEqexHkKnsRzyl6EawpehGELn0VbTaC
+ H3M+hyiZQokszUOKLfJCiSz8Q4ot+UaMMPJLjzblUpM+0VWVQa9Rkz2DR40yWzeDID4neQ4vK3wSMUGJ
+ K0pPkjtyU5RAmlGSPblJjjTKP4gpyjiEIbQ2gh6NNoMfYjeEID05hSIhO4YkDzuGJAU7hiQBO4YkADuG
+ JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXuYwAl7mMAZe5jASXuYwNlriMIJG1hT+Fr3hkd6dojGqg
+ WbNdmUvUTY855zyFJe0tfRXvJXgM8yJ2CPchdgf8IXUH/iF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2
+ CP8jdwn9JHcL+iV4DPUmeA3qJngN0SZ4Da8oeQ+aLn0WmzWCHrU7hSXaP4gp9EOKLftGjDH6So419k2Q
+ OPFPkTrmTZA4zkWMMKo6hSOILX0UbyN3CmImeAxlNYIdeUSLLppLjze2TJA4xEaMMcA7hSSqMX8ZiC19
+ FWEtfRU8MH8YIDWCHg46hiMFO4YkAjuGJAA7hiQAO4YkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyy
+ gACMsoABjLKABoyygBWLsn81hq96YnupbJBroFu1W5dI1EuONus9hif4MX8Z+yh6D/wjdwn8IXUH/SB1
+ Bv4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8idgj+I3YJ/SN3CvgkdwrpI3cK0yR3
+ C8UneQ7ELX0U0zOAG+g7hST1RIsv9EyQOO9Rkj3qUZI9502QOOJGjDDUPIYlvTGAGacoeg+XInYIjyN3
+ CpAufhadO4YlsUWLL71IjTO6RYswozqFJH0ufhZXKHoPOSZ5DSAneg4PLn4VBTmFIgE7hiQAO4YkADuG
+ JAA7hiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeqhsAHqobAJ6qGwJeqhsHHqobEZ2pmeAa6BbtFyX
+ StZLjjbsOoQk+C59Fv0neQ7/I3cK/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF1B/8hdgf/IXYI/SF2CPchdgjtInYI5yR3C+YoeQ7sLX0V8zeDIPBFizDjUpM+1ViW
+ RcpVlUHFS482wkCIKbw1gh6yLHwTqCV4DKEhdgedInYJnip7EqQ2gh6rP4gpqkWLMJpFizB6PocoUDGA
+ Gi4oeg8ZI3cKDSF2BwUidggBLn4VADuGJAA7hiQAO4YkADuGJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARYowAEWK
+ MABSkT4AXJdKAl2YSwpemEwgXphMUFuXSZFUk0DISIwz6DuEJPgufRX9JXgL/yJ2CP8hdQf/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/SF1
+ B/sidgj6JHcK+id5DvstfBT4NoIe5kSKLsdSkz+oW5lIk1iWRYhKjjWEPIYlgzF/GYEpexB+JHcKfSF2
+ B3widgh8KHoPfTKAG308hSV3QootZ0aMMEtEii4qO4YlEjB/GAgoeg4DIXUHASB1BgAgdQYAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFijAARYowAEWKMAJCiC0HQIcqEj+GKSo+hidbPIUlmziD
+ IdAygBvuLHwT+yV4DP8hdgf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yJ2CP8ldwv/KXoQ/y9+F/c3gh/aQYkrq06R
+ On1bmEhbXJlJR02QOD88hSQ9MH4XPCh6Dzsjdwo7IXUHOyJ2CDsoeQ87MX8ZOjqFJDZBiSwuRowxIEeN
+ MhBHjDEGQ4ouAT2HJwAoeg8AIHUGACB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApL+cAKS/nACkv5wApL+cAH6q
+ cQBNjjkCR4syCUOJLRc+higsOIIhTDB+GHkqexKvJ3kO2SV4C/Ejdwn8IXYH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/InYI/yV3C/8pehD/L34X9zeCINpDiS2rUpM+eWWeU1BypmIxa6JaHE6QORI1gR0OKXsQDSN3
+ Cg0hdQcNInYIDSh5Dw0xfxkNOoQjDEGJKwpGjDEHSI0zBEiNMwFIjTMASI0zAEiNMwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACkv5wApL+cAKS/nACkv5wBn7yWA3emaQlZlUYaSo02NkKILVk7hCSBMn8aqSl6
+ Ec0kdwvoIXYI9yB1Bv0gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdgf/I3cJ/yZ4Df8rexP6NoEe50eL
+ McVal0edbaNcdHyrbUmDr3Uiga5yCnKmYgJPkToBJngMACF1BwAidggAKHkPADF/GQA6hCMAQYkrAEaM
+ MQBIjTMASI0zAEiNMwBIjTMASI0zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKS/nACkv5wApL+cAqS/
+ nAaivpoOjbKCHW6hXzhWk0ReR4oyiTyEJbIyfxvSKnoR5yR3C/Qhdgj7IHUG/iB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF1B/8hdgj/I3cJ/yd5DvwzgBvzRYsv4FiWRcNnn1abcqViZneoZzF4qWgOeapqA3mq
+ agF5qmoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAob2YAKG9mAGhvZgEob2YDaC9lyCUtok+e6htYmCZT4pKjTayOoQk1S9+
+ GOwoeg/2I3cK+yF2B/4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8hdgf/JHcL/i59
+ Fvs+hijwTY852VmWRrJgm054ZJ1SOWWeUxFnn1UDZ59WAWefVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbupIAm7qSAZu6
+ kgebupIWmrmRNZK1h2J/qnGPZZtUtEyNONM4giHrK3sT+CV4DP0idgn+IXUH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8idgn/KXoR/jWBHfg/hynjR4wyvEyPN4BOkDo9T5E7ElCS
+ PANRkj0BUZI9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJK0hwCStIcCkrSHCZK0hx2RtIZIi7B/gnuobbVkm1PWS4036zWB
+ HvgneQ79InYJ/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2
+ B/8leAz/K3sT+jF/GeY1gR6+N4MhgjmEIj45hCMSOoUjAzuFJAE7hSQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgat0AIGr
+ dAKBq3QLgqt0IoGrdFN8qG6UcKFgylyWSulGijH4MX4Z/SR3C/8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2CP8kdwv6J3kO5ih6EL8pexGCKnsSPyt8
+ ExIvfhcEN4MgAVuYSABuo14AbqNeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrnlsAa55bAmueWwtrnlsja55bVmecV5lel0zQT4877j2F
+ J/stfBX/I3cJ/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IXUH/yF2CPoidgnnJHcKwiZ5DYgtfBRHPYYmG1aVQwpjnVIFbaJdAm6jXgBuo14AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSS
+ QgBUkkICVJJCC1WSQiNVkkJWUpE/mUuNN9BBhyvuNIAd+yl6EP8idgj/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH+yJ2CewmeA3NLn0Wnj+H
+ KWhXlUQ9Zp5VI2uhWxJuo14HbqNeAm6jXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQogtAEKILQJCiC0LQ4guI0OILVZBhyyZPYUm0DaB
+ H+4tfBX7JngN/yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8hdQf8JHcK8yt7Et85gyLBTY85m2CaTnFpoFhJa6FaKGyiXBBsolwDbKJcAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqsCkAKrA
+ pABLjDgAN4EhAjaBHws1gR8jNYEeVjSAHZoxfxrQLXwV7ih6D/skdwr/IXUH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/4leAz5Ln0W7z6G
+ KOBSkj7IYJpOn2aeVWton1c7aKBYGGmgWAVpoFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqwKQAqsCkAJm3kAFYk0YEP4YqDTSAHSYvfRdYLHwUmyp6
+ EdEneQ7vJHgL+yJ2CP8gdQf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IXYH/iZ4Df0vfhf5P4cp81CRPONcmEq7YZtPgGKcUEZjnFEcY5xRBmOc
+ UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrA
+ pACqwKQBpr6fA4SreQhimVIVR4oyLzSAHWAqexKgJngN0yR3C+8idgn8IXYH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdgf/JXgM/i59
+ Fv48hSb8S4438FWUQslZl0aJWpdHS1qXSB5al0gHWpdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqsCkAKrApAKov6IImbeRFIKqdydkmlVFRYkxdDF+
+ Ga0neQ7ZI3cJ8SF2B/wgdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAv/LHwT/ziDIP5Eii70TI84zE+RO4xQkTxNUJI8H1CS
+ PAdQkjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACqwKQAqsCkBKnAoxGiu5splLSLSX6ocW9dlkyaPoUpxCx7FOQkdwv1IXYH/SB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yN3
+ Cv8pehD/MX8Z/zuFJPRBiCvMQ4otjEOKLk1Dii4fQ4ouB0OKLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrApACqwKQGqcCjHKW9nkOcuJRyi6+BoW6f
+ YMhMjTjhM38c8SZ4Dfohdgj+IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/InYI/yZ4DP8rexL/MX8Z9DWBHsw2gh+MNoIgTTaC
+ IB82giAHNoIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAqr+jAKq/owipv6Mjpr2fVJ65l46QsofEdqNo51OQQPY3gSD7KHkP/SJ2CP8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8hdgf/I3cJ/yZ4Df8qehH0LHwTzCx8FIwtfBRNLHwUHyx8FAcsfBQBOIMhAEiMMwBXlUQAYpxRAGqg
+ WQBtol0AbaJdAG2iXQBtol0AbaJdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG+kXwBvpF8Ab6RfAG6k
+ XgBuo10AbKJbAGmgWABon1cAb6NeAHysbgCLtX8AmL2NAKDClgCkxJoApMSaAKTEmgCkxJoApMSaAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpv6MAqb+jCKm+oialvZ5an7mXmJKy
+ iNF4pGvzVZFD/TiCIv4pehD/InYI/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8idgj/I3cK/yV4DPQmeQ3OJ3kOjyZ5
+ DlImeQ0mJnkODix8FAg4gyEISIwzCFeVRAdinFEGaqBZBG2iXQJtol0BbaJdAG2iXQBtol0AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAb6RfAG+kXwBvpF8BbqReA26jXQVsolsHaaBYB2ifVwhvo14IfKxuCIu1
+ fweYvY0GoMKWBaTEmgOkxJoBpMSaAKTEmgCkxJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAKm+ogCpvqIIqL6hJ6W8nlyeuJaakbGI03ika/VWkUP+OYIi/yl6EP8idgj/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF1B/8idgj/I3cK9SR3C9MkdwucJHcKZSR3Cz4meA0pLHwUJDiDIiNIjDMjV5VEIGKc
+ URtpoFkTbKFcCmqhWgNknVMBU5M/AD6HKABPkTsAZp1UAHioaQCCrnQAg691AHmqagBmnlQAbKJbAm6j
+ XgZuo14PbaNdF2yiWx5poFgiaJ9XI2+jXiN8rG4ji7V/IZi9jR2gwpYVo8OZDKPDmQWiw5gCn8GVAIy2
+ gAB8rG4AfKxuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqL2hAKi9oQiovaEmpbudW564
+ lpmRsYfSd6Nq9FWRQ/04giL+KXoQ/yJ2CP8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yJ2Cf8kdwr3JXcL3CR3
+ C7EkdwqGJXcLaCh5D1gvfhdVOoQkVUmNNVRXlUROYZtPQ2aeVS9lnVQaWJZFC0GIKwU1gR4DPIUmA0+R
+ OwNmnVQDeKhpA4KudAODr3UDeapqA2KcUANamEgGZZ5UEmqhWSVrols5a6FaSmmgWFNon1dVbqNeVXur
+ bFSIs3tQlLqIRpu/kDSdwJIemr6PDpS6iAWLtX4Cfq1wAHysbgB8rG4AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACovaEAqL2hCKe9oSWku51XnbeVk4+whsp2o2jsU5BB+TeBIfwoeQ/+InYI/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF1B/8idgj/JHcL/yd4DfooeQ7nJ3gNyCZ4DasneQ6YK3sTkDOAHJA/hymTTI83kVeV
+ RIlfmk12YZtPV1qXRzNGizEbM4AbETF/GQ88hSUOT5E7DmadVA54qGkOgq50DoOvdQ55qWoOYpxQD1CS
+ PBRZl0YnY51SRmegV2dpoFiBaJ9XkGefV5Rtol2UeKlpkoOwdouNtoB7k7mHXpO5hzqOt4IeiLN7DoKw
+ dAZ9rG8CfKxuAHysbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9oQCnvaEHp72hIKO7
+ nE2btpOCja+DtnGgY9pPjjztNYAe9yd5Dvwidgj+IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXYI/yR3Cv8oeQ//LHsT+y18
+ FO0rexLXKnoRxCt7E7oyfxu7PIUmxUaMMc1QkTzNV5VFwluXSatZlkaETI44WTeDITssfBQvMH4YLDyF
+ JStPkTsrZZ1UK3ioaCuCrnQrg691K3mpaitinE8sSo41Mk2QOElZl0dwYZxQmWWeVLlmn1XMZ59W0Guh
+ WtFypmPOe6tsxYGvc7GFsXeNhbF3YIKwdDp/rnIhfa1wEXysbgZ8rG4BfKxuAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAp72hAKe9oQWnvaAXobqaOJe0j2KFq3qNZ5tXtkaJMdYwfRjsJXgM+CF2
+ B/4gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF1B/8idgn/JnkN/y18Ff8zgBz6NoEe6TOAG84yfxq6NoIftEGILMFOkDrZVZRC61iW
+ RfBYlkXnVZRC00yOOLI9hSeMLX0Wcil6EWgvfhdmPIUmZU+RO2VlnVNld6hoZYGuc2WDr3RlealpZWGb
+ T2ZHjDJrQoksf02QOKBYlkXEYJtO4GSdU/BmnlX0Z59W9GmgWPJrolrrbaNd2XCkYLpzp2SQd6loZ3mq
+ a0N7q20lfKxtD3ysbgN8rG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnvaEAp72hA6a8
+ oAyct5UejK6COHKgZFpRjz6IN4EguSl5EN8jdgn0IXUH/SB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yR3Cv8qexH/M4Ac/z2F
+ JvdCiCvcQYcqs0GIK5NLjjaMXJhJoWefVshon1jlYptR7lmWRutOjzrgQYgrzjJ/G7kqehGtK3sTqjOA
+ HKxAiCqtUZI9r2SdU690pmSvfatur32sbq90pmSvX5pMr0aLMLI8hSW7Q4kty0+RO9tZl0fpYZtP8WSd
+ U/NjnVL1XppM9lmXRvVYlkTtW5hJ3WSeU8Jto12bcqZibXSnZT92qGcadqhnBnaoZwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9oQCnvaEBpLueBIyvggxunmAbT448NjaBH2cpeRCkI3cJ1SF1
+ B/AgdQb8IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8hdgf/JXgM/y18FP85gyL/Rosx9U6POdJQkDycVJNAcGOcUWF2p2d0fatvnHeo
+ aLtqoFnFWZZHxkmNNcM6hCS8Ln0Wtyx8FLo0gB3FP4cp0kqONtxWlUPiYpxR42yhW+NwpGDjcKRf42if
+ VuNZlkXjR4sx4j6GJ95BiCvYSo420VWUQsxemk3KZJ1Ty2GcUNNamEjeU5RA6lCSPPJTk0DxWphI42Cb
+ T8BjnVKKZZ5UUWafVSJmn1UHZp9VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp72hAKe9
+ oQCduJUBZppWBUSIMA8yfhooKHkPWiR3CpwidgjSIXYH7yF1B/wgdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8meA3/L34Y/z6G
+ KP9OkDr0WZZGzl2YSpFim1BdcaRhQ4SvdkqHsXplfqxwe22iXYNZlkeFR4wzhDeCIYIvfheFNYEflUWK
+ MLBRkj7MWZdH4l6ZTO1gmk7xYJpO8l6ZTPRbmEj1VpVD9U+QO/RIjDPuRIov3kaLMcRMjjepVJRBlF6a
+ TIlknlOKZZ5UmmGcT7RcmUrQWJdG51WVQvRSkz/uUJI8zU+RPJVPkTtYT5E7JU+ROwhPkTsAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnvaEAp72hAIOqdwA+hSgDMH0YDCt6EiQoeRBXJ3kOmiZ4
+ DdEkdwvuI3YJ+yF2B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/InYI/yd5Dv8ygBv/RIov/1iVRfRlnVPNaqBZjm6iXVR3qGgxibJ7KYy0
+ fzWBrXNBbqJeRVmWR0ZHizJGN4IgRjOAHExFizFiWpdIh2WdVKxon1jJZZ1U2F2ZS95UlEHiTY856keM
+ M/BFii/yRYsw7kiMM+BLjjbFTY85n1CRPHlVlEJbXZlLS2afVU1so1xhbaNdhWqhWqxjnVLOV5ZE5UqO
+ NelAiCvOPIYmlzqEJFk5hCImOYQiCDmEIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKe9
+ oQCnvaEAPIMmADN+HAIyfhsLMn4bIzJ+GlYxfhmaLnwX0Ct7E+4neQ77I3cJ/yF1B/8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8idgj/KXoQ/zaC
+ H/5Mjjj9Y5xS8nOlY8p5qGqLe6ptToCsciWLs34UjrWBFYKudBpvo18bWZdHHEaLMRw3giAcPYYnIlyY
+ SjdwpGFbdqdnf3OmZJtqoFqqW5hIsUuONr0/hynPOIMh3jeCIOM8hSbaRoswwk6QOp5Tkz91VZRCTliW
+ RTBemkwha6JaInepaTZ6q2xadadlg2igWKpVlELLQYkr2zSBHcgufRaWLHwTWSp7EiYqexEIKnsRAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABChi0AQoYtAkKGLQtChi0jQoYsVkCF
+ K5k8gyXQNYAe7i18FfsmeA3/IXYH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yJ2Cf8qexH+OoQj/FOSQPhvol/rgq10w4mxfYWLs39KjLSAH461
+ ggmOtYIFgq51Bm+jXwZZl0cGRosxBjiDIgZWlUMKealrGoOvdzOCr3ZNe6ptYW2iXWxYlkV1QoksiTSB
+ HakufRbFLn0WzzSBHcFBiCueTpA5dVWUQk9ZlkYuWpdIFl6aTAp2qGcLhbF3G4KwdTh3qWhcZZ5Tg02P
+ OKw3gyDJK3sTwSZ4DZMkdwpZI3cJJiN3CQgjdwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFaQRABWkEQCVpBEC1aQRCNWkENWU49AmUyLONBBhizuNX8e+yl6EP8idgj/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/I3YJ/it7
+ Evs8hSb1V5VF63enadiOtIKwl7qNd5q7kEGbvJEam7yRBpa5igCCrnUAb6NfAFmXRwBGizEATY85AImy
+ fAKQtoUJj7aDFYmyfSF/rXIqbqNfL1OTQDk6hCNWL34XhSx8FK0tfBS/MX8ZrzuFJIVGizFaTpA6OFKT
+ Px9VlEEMWJZFA4GucgSCsHUQeqprJmuhWkRXlURqQYgrlzB+GL0oeQ68JHcLkiJ3CVkidggmIXYICCF2
+ CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZxeAG2cXgJtnF4LbJxdI2yb
+ XVZomViZXpRN0E+NPO4+hCj7LXsV/yN2Cf8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8kdwr9K3sS9jqDI+dUk0HQd6dosJO3iIegvpZZo8CaMKXC
+ nBOlwpwEpcKcAAAAAAAAAAAAAAAAAAAAAACTuIgAk7iIAJO4iAKQtoQFibN9B3+tcgltol0LSIwyFTeC
+ IDg0gR1vNIEcojWBHr04gyG1PYYmkUKJLGZFizBCR40yJUiNMw9HjTIEa6FZBXCkXxNroVotYJtOT1KS
+ PnZAiCqiMn8awyp7Eb4neQ6SJXgMWSR4CyYkeAsIJHgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACBpnUAgaZ1AoGmdQuApnUif6Z0UnqjbpNunF/JW5NK6EWIMPcwfRn9JHcL/yB1
+ B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQf/InYJ/yZ4
+ DfssexTuNoEf1EmNNaxpn1l8jbOBUaC/lzGmwp0aqMSgCqnEoQKpxKEAAAAAAAAAAAAAAAAAAAAAAJO4
+ iACTuIgAk7iIAJC2hACJs30Af61yAFiWRgFCiCsKQYgqLUGIKmZBiCudQYgrwkGJLMpCiS24Q4otlEOK
+ LWlBiSxBPocnITWCHhBEii0SWphHJ2CbTkxemUt3VZVCoEeMMsE5hCLRMH4Xvyt8E48pexFVKHoPJCh6
+ Dwgoeg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2thACNrYQCja2ECY2t
+ gxyMrIJFhal7fHahaa5flU/QR4kz6DJ+G/YmeA39InYI/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8leAz/LHwU+jSAHOk8hCXGRooxkVmVRlV5qGsql7mNFKLA
+ mQqoxKAEqcShAanEoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS441AEuO
+ NQhKjjUmSo01VkmNNIpHjDOzRYswzEOJLdFAiCq8PocnljqFI201gh1LMH8XOTSBHDpEii5RT5E6eFKT
+ P6JQkjzCSI0z0DyGJskzgBurLn4Weyx8FEgrfBIeKnwSByp8EgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAk7CLAJOwiwGTsIsGk7CKE5KviS+Jq35XdaBog1yUTKtGiDLONYAe6yp6
+ Evsldwz/InYJ/yF1B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdQf/I3cJ/yp7
+ Ev02gR/3Qogs40uNNr1SkT+DWpZIQ2qfWhiHsHoImbqPA6fDnwGpxKEAqcShAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPkTsAT5E7Bk+QOxpOkDk8S443ZEeMM4xDiS2xPocoyzuF
+ JM05gyG4N4IfnDWBHYU0gRx4NYEdeTqEI4lAiCqkQ4ouvUSKLspBiCvCOoQjpjOAHIAvfhdYLX0VMix8
+ FBUsfBQFLHwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWsY0AlrGNAZax
+ jQOVsY0KlLGMGoeqfDNvnWFYWZJHhkiJNLY8gyfgM38c+Ct6E/8ldwz/InYI/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IXYH/yJ2CP8meA3+MH4Y+D+GKexOjjrTWpVHq2KaUHRmnFY4a59bEXin
+ agSIsHwBo8GbAKnEoQCpxKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKS
+ PQBSkj0DUZI9Dk6QOiJJjTQ+Q4ouYD2GJ4g5gyKwOIMgxjmEIsc8hSXAPoYnuT+HKLQ/hyi1PYYnujyF
+ JcI6hSTFOYQivDeDIKE0gR15MX8ZUi9+FzQtfRUcLX0VCy19FQItfRUAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeyjwCXso8Al7KPAZeyjwSVsY0KgaZ1GmqaWzpck0trU49Bo0uL
+ OddBhiz1NH8d/il6Ef8kdwr/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2B/8jdgn+JXgM/ip7
+ Evo1gB7uRYkw1laTQ7Zkm1OObqFfXXOkZCx0pGUNdqVnAnemaQCGr3oAqcShAKnEoQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU5M/AFOTPwFSkz4GTI83D0SKLiA8hiY5N4IfXjWB
+ Hoc6hCKpQYgrwEmMM85OjznYUJE83U+QOt1KjTXWQ4ktyjuFJLc0gRydL34XeC19FU4tfRQtLX0VGC19
+ FQwtfRUFLX0VAS19FQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl7KPAJey
+ jwCXso8Al7KPAZKviQN7o24McZ5kKW2bX1pomVqWYZZRzVOPQe9AhSv6MH0Z/Sd4Dv4idgn/IXUH/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQf/InYI/iV4C/wpehD6MH4Y8TmDI9tHizK3V5RFjmidWGV1pWc+fKlvHH2p
+ cAh+qnACfqpwAH6qcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABTkz8AU5M/AFGSPQFEii4FOYQiDTSAHBwxfxk2NoEeV0OJLX1Skj+jXplMxGScU91mnVXqZJxT6V6Z
+ TNlUk0G6R4syljiDIXArexJLJngMKiZ5DRQoeg8JKnsSAy19FQEtfRUALX0VAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXso8Al7KPAJeyjwCXso8Ai6uBAIipfQeHqH0hhad6ToCl
+ dYZ3oWq7ZZhW306MO/A5gSP4LXsV/SZ4Df4idgj/IHUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/4jdwr7J3kO9i18
+ Fe01gR7dPYUnvEaKMY5SkT9gYppROnSkZh6Aq3MNgqx1BIKsdQGCrHUAgqx1AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOTPwBTkz8AQ4otADF+GQEufRYELnwVCy99
+ FhY/hykqW5dITG+jYHh6qWyjf6xxxX+scdd9qm/WeKdpv2+iX5dhm1BqTI44QjJ/GiQidggRIXUHByF2
+ BwIidgkBKXsQAC19FQAtfRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACZsZEAmbGRBZmxkBmWsI07kK2HZ4Woe5VynmS8WpJJ2keIM+05gSP4LnwW/SZ4
+ Df8hdgj/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8hdQf/InYJ/SR3C/YpehDoL30X0jiCIbQ/hiqMRIkvYEmMNThTkT8bZpxVCn6q
+ cQOCrHUBgqx1AIKsdQCCrHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAtfBQALXwUAC18FAEtfBQCMn8aBV+ZTQ6ArXMmjbSCTJK3h3KSt4eRkbaGoo60
+ g6CLs3+Lh7B7Z4Ctc0BypGMfUZE9DCV4DAQgdQYBIHUGACB1BgAgdQYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKC1mACgtZgDn7WYDpuz
+ lCKVr4w+ial/YHiha4pmmFe2V5BF2EiINO05gSP4LXsV/SV3C/8idgj/IXUH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUH/yJ2Cf8leAz7KHkQ7yx8
+ FNUxfhqtOIIifj+GKlRDiC40RIkvHEWKMAtJjDQDZZxUAIKsdQCCrHUAgqx1AIKsdQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC18FAAtfBQALXwUAC18
+ FABemEwAlrmMBJy9khGcvZMnnL2SPpq8kFCYuo5albiKWZO3iE2St4c3kbaGII+1hA6Jsn0DU5I/ACB1
+ BgAgdQYAIHUGACB1BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAoLWZAKC1mQGftZgGmrKSDpKuiR2GqHw0eqJuWm+cYopjllS0VY9D00aI
+ Mug4gSL2LnwW/Sh5D/8kdwr/IXYI/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8hdgj/JngN/y18FfozfxzpOIIixjuEJpE+hSlWQYcsK0OILhZEiS8LRIkvBESJ
+ LwFEiS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6+lQCevpUBnr6VB52+lBCdvZMZm7yRIJm6
+ jiSWuYsklLeJH5O3iBaSt4cNkreHBZK3hwGSt4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgtZkAoLWZAJ+0
+ mAKXsI4FjauEDISmeRp8o3E2dZ9oXGuaXYVflE+qU45By0iJNOc9gyf3Mn4b/Cl6Ef4kdwv/InYI/yF1
+ B/8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yF2B/8hdgf/IXYI/yR3Cv8rexP/OIIh+kOI
+ LuZLjDfAUI89hVGPPkNNjjoYSIszCEWKMAREiS8BRIkvAESJLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAnr6VAJ6+lQCevpUCnb6UBZ29kwibvJEKmbqOC5a5iwuUt4kKk7eIB5K3hwSSt4cCkreHAJK3
+ hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKC1mQCgtZkAnrSWAJCthwKHqH0FgaV2DH6jchx4oWw1cJ1jVmiY
+ WX1glVCmV5BGzEyLOeU/hCrzNH8d+Sx7FP0neA7+JHcK/yJ2CP8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF2
+ CP8jdwn/JXcL/yZ4DP8meA3/KXoQ/zN/HP9DiC75UZA/5VuWSr1imVGAZJpUPWGZURFYk0UDT487AUWK
+ MQBEiS8ARIkvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACevpUAnr6VAJ6+lQCdvpQBnb2TApu8
+ kQKZuo4ClrmLApS3iQKTt4gBkreHAZK3hwCSt4cAkreHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoLWZAKC1
+ mQCSrokAgqZ4AICldQF/pHQEf6RzC3uibxh1n2kwcJ1jUmuaXntll1alW5JKx06LO99Dhi7vOYEj+DF9
+ GfwqehH+JXcM/iJ2Cf4hdQf/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yF1B/8hdgj/JHcK/yh5D/4sexP+LnwW/jB9GP4zfxz/PYQn/0yN
+ OPlZlEjlY5pTvGmdWn9sn107bJ9dD2qeWwJonVgAWZRHAESJLwBEiS8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJ6+lQCevpUAnr6VAJ2+lACdvZMAm7yRAJm6jgCWuYsAlLeJAJO3iACSt4cAkreHAJK3
+ hwCSt4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+kdAB/pHQAf6R0AH+kdAF/pHQCfKNwCHqi
+ bhZ4oWwudZ9pTnGdZHNpmVubYZRRwVaPRd1LijfuPoQp9jJ+G/gqehH6JngN/CR3Cv0jdgn+InYI/yF2
+ B/8hdQf/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IXUH/yF2B/8idgj/I3YJ/yR3
+ C/8pehD9MH0Y/DaBIPo7gyX6PoUp/EGHLP1IijT+UpA/+VqVSOVgmFC8ZJtUf2acVjtmnFYPZptVAmab
+ VQBmm1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAf6R0AH+kdAB/pHQAf6R0AH6kcwB+pHMCfqRyCH2jchR8o3Eme6JvQXmhbWl1n2mZbJpev16T
+ TdZNizrhPIIm5jF9GestexXyK3oS+Sl5EP0neA3+JHcL/yJ2Cf8hdgf/IHUH/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yF2B/8jdgn/JXgM/yh5D/8qehL/LnwW/jR/Hfk8hCbyRIgw7UuMN+1Rjz3yVJFB+VWS
+ Q/1WkkP5VpJD5VWSQ7xVkkN/VZJDO1aTQw9Xk0QCV5RFAFeURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfqRzAH6k
+ cwB+pHMCgaV3BYSmeg2HqH4diaiAPoanfGl8onCNa5pdo1eQRa5EhjC3O4IlxjuCJds7giXtOIEi+DN+
+ G/0texT/KHkP/yR3C/8idgj/IXUH/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1
+ Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8gdQb/IHUG/yB1Bv8hdQf/JHcK/yl6EP8vfRf/NoEg/z6E
+ KP5FiDH7S4s37U+OPNpVkUPMXZVLzGWaVdlpnFrtZZpV+luUSflRjz3lSYs1vUWJMH9DiC47RIgvEEmL
+ NAJQjzwAZ5xXAHGhYgBxoWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+pHMAfqRzAISnegCPq4cBkayJBJKtigySrIofjaqEOoKl
+ d1BwnGJeXJJLZ0yKOXRLijiPUY0/tVKOQNVNizrpQ4cv8jiBIvUvfBf1KHkP9SR3C/Yjdgn4I3cK+iR3
+ C/0kdwv/JHcL/yR3Cv8kdwr/I3cK/yN3Cv8jdwr/I3cK/yN3Cv8kdwr/JHcK/yR3C/8kdwv/JHcL/yR3
+ C/4kdwr8I3YJ+SN2CfcneQ/1MX4a9T2EJ/VKizb1WJJH9GWZVe5rnFzWapxbs2udW5txoGObe6Zusn+o
+ ctZ1ombvYJdP9E2NOeNAhiu+OoMjgzqDJEJIijMXYJhPB2udWwNwoWEBcaFiAHGhYgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAk62LAJOtiwCTrYsBk62LBZOtiw2OqoUYgqV3InGcYylfk04vWJBGPWCUUFtomFmHZphXrF2T
+ TcNQjT7NQYUs0DR/HdAsexPSKXkQ1ip6Ed8ufBbqM34b9jR/Hf0zfhz/MX0a/zB9Gf8wfRj/MH0Y/zB9
+ GP8wfRj/MH0Y/zB9Gf8xfRn/Mn4a/zN/HP80fx3+NH8d+TF+GvEsexTmKHkP2it7E9I3gSHQR4oz0FmT
+ SNBsnV7QfaZxyYWqeq2FqnmFgql2aYare2mPsISEjrCErn2mcNFhmFDhSos23D2EJ8M6gySVRYkwXFuV
+ STFrnlwbb6BgDnChYQVxoWIBcaFiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTrYsAk62LAJOtiwCTrYsCk62LBI6q
+ hQiCpXcLcZxkDmSWVRJml1cdcp1kNnagaVlxnWR3ZphXiVeQRZFGiDGUN4AglC98F5cwfRihOIEitEOG
+ Ls1MijjmTYs69UqKN/lGiDL5RIcw+UOGLvlDhi75Q4Yu+UOGLvlDhy/5RIcw+UWIMflHiTT5S4o3+U6M
+ OvdOjDrtSYo13D+FKsMyfhuoL30XmDqDJZRNjTqUYZdRlHejapOKrYCNlbOMd5azjVeUsopBl7SNQZy3
+ k1aVtIt8fKZvo12VS8JIijPRQIYqzEOILrFSjz6IYplSXmudWztsnl0gbZ9eDW2fXgNtn14AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOtiwCTrYsAk62LAJOtiwCTrYsBjqqFAoKldwJ0nmcDb5xhBXegagx/pHMbf6R0MXih
+ bENrml1OW5JKU0iJNFU5gSJVM34bWTyDJmdOizqCXZNMpmeYV8lnmFjfYZVR5VuTS+VXkUblVpBE5VaQ
+ ROVWkETlVpBE5VeQReVYkUflWpJJ5V2UTeVillLlZ5lY4WmaWtRlmFW7WZJIl0SHL3I1gB5bPYQnVVCO
+ PVVmmlZVfaZxVJKxiFGeuJZDobmaL6C5mSKiupoipLucMJWzi0tzomV0VpJEokiKNMZFiTDVS4w3z1aS
+ RLZgmE+MZZpUXGabVTJmm1YUZptWBGicWACRsYgAkbGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk62LAJOtiwCTrYsAk62LAJOt
+ iwCOqoUAg6V4AIGldgCFp3oBh6h9BIiofgqFp3oUfKNwG26cYCBdk0wiSoo2IzqCIyM6giQnUo4/N2qZ
+ W1N5oWx5f6Rzn32jcbZ0n2i8bZtfvGiZWbxmmFe8ZphWvGaYVrxmmFe8Z5lYvGmaWrxrm128b51hvHag
+ aLx8pHC4gaZ1qoCmdJB3ompqYJZPQkCFKyo+hSkjUo8/I2ibWSOAqHQjlrONIaO6nBynvaETqL2hDam+
+ og2nvaATiq5/JmaaVk9TkEGJTY05vEyNOdxQjzznVZFC2lmUR7FblUl3W5VKQVyWSxpfl04GdqNoAJGx
+ iACRsYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJqX8Aial/AImpfwCJqX8Bial/AoWn
+ egR8o3AGb5xgB12TTAhKijYIO4IlCFCNPQt3oGkXial/LZCsh0qRrYhni6qCeIKmd315oWx9c59mfXGe
+ Y31wnWN9cZ1jfXGdY31ynmR9dJ9nfXehan18o3B9g6d4fYusgXqRr4hvlLGLW5KwiT6FqXkgXZVMDUCG
+ KwhSjz8IaJtZCIGodQiWtI4Ho7udBqi9ogSpvqIDqb6jA6K7mgVzoWURX5dPOlmUSHlXkkW1VJFC3lGP
+ PvJOjjvtTI05xkyNOYdOjjtLUZA/IF2WTAiEqnkBkbGIAJGxiACRsYgAkbGIAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAImpfwCJqX8Aial/AImpfwCJqX8Ahad6AHyjcABvnGAAXZNMAEqKNgBLijcAjquEApqy
+ kwecs5USnLKVIJmxki2SrYo1iKh+OH6kczh4oWw4dqBpOHWgaDh1oGg4dqBpOHehajh5om04fKRwOIGm
+ djiJqn84kq+JNpmzkTGetpYoobeaGqG3mQyYs48DV5FFAFKPPwBom1kAgah1AJa0jgCju50AqL2iAKm+
+ ogCpvqMAfKZvAWudXAtqnFowZ5tYbWKYUqlalEnUT4487USIMO8+hSnOP4Yqk0aKMlhVkUMsb59iEY2v
+ hAWRsYgBkbGIAJGxiACRsYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+0mACftJgAn7SYAp60lwSds5YHmrGTCpOuigyIqX4MfqRzDHmi
+ bAx2oGkMdqBpDHagaQx2oGkMd6FrDHmibQx9pHEMgqd3DImrfwySr4kMmrOSC5+2mAmiuJsGpLmdA6S5
+ nQGkuZ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1o2gAdaNoCHWiZyZxoGJXZ5tYiVqU
+ SLRJizXVOoMk5TWAH9U+hSmoUY8+dmicWUuBqHUpj7CGEpGxiAWRsYgBkbGIAJGxiAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn7SYAJ+0
+ mACftJgAnrSXAJ2zlgCasZMAk66KAIipfgB+pHMAeaJsAHagaQB2oGkAdqBpAHagaQB3oWsAeaJtAH2k
+ cQCCp3cAiat/AJKviQCas5IAn7aYAKK4mwCkuZ0ApLmdAKS5nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHqlbQB6pW0FeaRsFnGgYzZjmFJcUY8+hj6FKbIzfxzXNoEg30eKM8helk2jc6FmeoSq
+ eU2MroIkjK+DCoyuggKMroIAjK6CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeqVtAHqlbQJ4pGsKapxaG1WR
+ QzdEiC9gN4EhljN/Hcw8hCboTo074mKYUshyoGSgfaZxaoKpdjKCqXcPgql2A4KpdgGCqXYAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB6pW0AeqVtAXajaQRelk0NS4s3JEGGLEw8gyaHPIMnxkSIMOxRjz/wX5ZO22mb
+ WrRvn2F5cqFkOnKhZRFyoWQDcqFkAXKhZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHqlbQB6pW0Ab59hAVSQ
+ QgdNjDocS4s4REqLN4FLizjETo087lOQQfZYk0fjXJVLvF+WToBgl089YJdPEmCXTwNgl1ABZ5tYAHij
+ awB7pW4AgKd0AIirfQCQr4cAlrOOAJq1kgCctpQAnLaUAJy2lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAeqVtAHqlbQBil1EAX5VOBl6VThpelU5CXpVOf12VTcNak0ruVpFE91KP
+ P+VPjTu+TY05gkyMOD5NjDkST448BFmTRwFyoGQAeKNrAHulbgCAp3QAiKt9AJCvhwCWs44AmrWSAJy2
+ lACctpQAnLaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHWh
+ aAB1oWgGdaFoGXWhaEF1oWh/cZ9kwmiaWe1ak0j2TIw55UKHLb88hCaDOoMjQD2EJxRLizcFYphSA3Sh
+ ZgJ4o2sCe6VuAoCndAKIq30CkK+GApazjgKatZIBnLaUAZy2lACctpQAnLaUAJy2lAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiat+AImrfgWJq34Yiat+PoirfneDqHi3c6Bm4l2U
+ TO5IijTiOoIjwDJ+GokzfxxLQ4cuIl2VSxRsnV0RdaJnEXikaxF7pW4RgKd0EYirfRCQr4YPlrONDZq1
+ kgmctpQFnLaUAZy2lACctpQAnLaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACUsYwAlLGMBJSxjBOUsYwxlLCLX4ysgpR3omq/W5NJ1USHL9g3gSDHNH8doD2EJ29Rjz9PY5hTRG6e
+ X0J1omdBeKNrQXqlbUF/p3NBiKt9QI+vhjyVso0ymbSRI5q1khKYtI8GkbCIAoSpeABUkEEAQoctAEKH
+ LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiykACYspADmLKQDJiykCCXso8/i6yBZXCe
+ Yo9Tj0C0QIUrzTmCItI7gyXCRokxp1WRQ5NimFKMa51ci3KgZIt1omiLd6Nqi3ylb4uDqHeIiax+gI2u
+ g22Or4RPiKx9LHijaxNil1EIUY8+A0SILwFChy0AQoctAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSu
+ iwCUrosAk6+KAJOvigKTr4oKk6+KGZKviTCEqHpQZ5lYeU2MOaY+hCjKOoIj3j2EJuBGiDHVUY8/zFyU
+ S8llmVXJa5xcyW+eYMlwn2LJc6BlyHejasZ7pG67fKVvpHija39tnV1TW5NJME2MORtGiTIOQoctBUGH
+ LAE8hCYANoEgADaBIAA2gSAANoEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlK6LAJSuiwCTrooBjqyFBYurgg6KqoEhiap/PH6l
+ c2BmmFeJTYw6sj6EKdM4gSLoOYIj70CFK+xKijbpVJBB51yUS+djmFLnZplW52eaV+dnmljnaJpY5Gia
+ WNtlmVXIYJZPqVaRQ4JLizdbRYgwPEKHLSJAhisQPIQnBTeBIQE2gSAANoEgADaBIAA2gSAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACUrosAlK6LAZOuigSOq4QNh6h9HYOmeDd/pXRceKFrhmaYV61QjT7MQIUr4jiBIe42gB/wOoIk7EGG
+ LOdLizfmU49B5lmSSOZdlEvmXZRM5luTSuZYkkbkVJBB4FCOPdVMizjFR4kyrUSHLoxBhixkQIYqQD2E
+ KCI5gyQPNoEgBjaBIAI2gSABNoEgADaBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSuiwCUrosDk66KDI6rhB6Fp3s5faNxW3Wg
+ aYZtnF+zYZZR1VKOQOZFhzDtO4Mm6zaAIOE1gB/TOoIkyUKGLcZLijfFUY4+xVSPQcVUj0HFUI08xUmK
+ NMVDhi3HP4QpyT6EKM0/hSnLQIUqtz+FKpA9hShmO4MlQTiCIiQ2gSARNoEgBjaBIAI2gSAANoEgAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlK6LAJSuiwaTrooZjquEO4SmeWN3oGuLaZpbtF2UTdlVkEPwUI099kuLOPBGiDLfQIUrwzmC
+ I6M3gSCPPYMniEWHMIZLijeGTow6hk2MOYZHiTOGPoQoiDeAIJA1fx6gOIEhuT2DJ9E/hSnTPoUoujuE
+ JpY5gyNuN4IhRjeBISM4giIMPIQnA0WJMQFvnmEAhKl5AISpeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNq4QAjauECY2rgyiIqH5cf6RzkXGd
+ Y7xelE7cTYs68EeJM/hMizn0U45B5FaQRMVUj0KZSYo2aTyDJ0k8gyY/QoYtPUiJMz1Lizc9Soo2PUSH
+ Lz06giNANH8dTDaAHmY6giSQPoQovj6FKdc8hCfVOoMkwTmCI6A6gyRyQIYrQE+OPB1jmFMMdKFnBYKo
+ dwKEqXkAhKl5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAma+TAJmv
+ kwCZr5MAma+TAISmegF9onALfKJwMnmhbHJynWSuZ5hX2leQRfJIiTT5RIcv8U2LOd9ZkUjCY5dTnGeZ
+ WGtjl1M6Uo4/GkKGLRBDhi4OSIkzDUuKNw1KijYNQ4cuDTuCJBE5giMdPIMmNz+FKWE/hSqTPYQouzqD
+ JNA5giPTOoMkw0GHLJ5Rjz5tZppXQ3aiaSd+pnMVg6l4CISpeQKEqXkAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZr5MAma+TAJmvkwGZr5MClK2NBXWeaBJnmFg7YpVSfF6T
+ TbhZkUjhU45A9E2LOfJMizjdU45Aul2TTJJnmVhpcJ1iQXOfZh5xnmQJZphXAlSPQgFJiTQBS4o3AEqK
+ NgBDhi4BQIUqA0CGKwtBhiwcQYYsOT+FKl48gyaIOYIjrjmCI8k+hSnSSos2xF2VTKJwnmF4eqNtUH6m
+ ciyAp3USgKd1BICndQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJmv
+ kwCZr5MBma+TBJmvkwuXrpEVgaR3KWSWVVJUjkKLTYs6vkyKOdxOizvlUY0/2VWPRLpakkmOYJVQYmiZ
+ WT5wnWIidaBnDnWgaAR1oGgBdaBoAHWgaAAAAAAAAAAAAEGGLABBhiwBQYYsBUGGLA5BhiwbP4UqMzyD
+ Jlo7gyWNPYQou0SIMNhQjj7eYZdRzG6dYKZ1oWdyd6JqQHmjbBp5o2wGeaNsAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAma+TAJmvkwKZr5MKma+TGZiukjCKqIJQbZpgelON
+ QaZFhzHHQoUt1EeIM8xRjT6xW5JKi2CUUGFjllQ8aJlZIG+cYQ50oGcFdaBoAXWgaAB1oGgAdaBoAAAA
+ AAAAAAAAQYYsAEGGLABBhiwCQYYsBUGGLApChi0ZQ4cuQESHMHpHiTSyTYw621WQRO5gllDmaJpZwGuc
+ XYdtnV5MbZ1fH26dXwdunV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACYrpIAmK6SBJiukhCYrpIqmK6SUY6qhn52nmqoWI9HxkOGL9M6giXLPYMnrUqKN4JbkkpZY5ZUOGaX
+ VyBomVoObZteBXSfZwF1oGgAdaBoAHWgaAB1oGgAAAAAAAAAAABBhiwAQYYsAEGGLABBhiwBRIcvA0+N
+ PA5Sjj80U49BcVWQQq5WkUXdWZJI9VyUTPFflU/MYJZQkGCWUFJhl1EiYZdRB2GXUQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiukgCYrpIFmK6SFpiukjmYrpJukKqJqHug
+ cNJdkk3jRIYw3TV/H8MxfRqTO4IlWVGNPy5jllMZZ5hXDWmZWgVqmVsBb5xhAHWgaAB1oGgAdaBoAHWg
+ aAAAAAAAAAAAAEGGLABBhiwAQYYsAEGGLABdlEwAY5ZSC2OWUjBillJuYZZRrV+VTt5clEv3WZJH9FaR
+ RdBVkEOSVZBDU1WQQyJVkEMIVZBDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAmK6SAJiukgaYrpIamK6SQpiukX6RqonAfaFy62CTUPRFhjHjM34cvil5EIMoeRBCN4AgFlSO
+ QgdhlVADaJlZAWmZWgBpmVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG6c
+ XwBunF8LbpxfMGybXW5qmlqtZZhW3l+VTvdXkUX0UY4/0E+NPJJOjDtTTYw6Ik2MOghNjDoAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYrZIAmK2SBpitkhuYrZJEmK2Rg5Gq
+ isd+oXPxYZNR+EWGMuUyfRu9JngNfyF1BzshdgcQJngNAjB9GQBXkEUAaZlaAGmZWgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcp5kAHKeZAtxnWQwcJ1ibm2bXq1omVneYJVP91aQ
+ RfRQjT3QTYw6kkyLOVNLizgiS4s4CEuLOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJqtkwCarZMGmq2TG5qtk0WZrZODkqqLx3+hdPFhk1L4RoYy5TJ9G70meA1/IXUHOyF1
+ BxAkdwoCKnoRAESGMABSjEAAUoxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABwnWIAcJ1iC3CcYTBunGBua5pdrWaYV95flE73VpBE9E+NPNBNjDmSTIs4U0uLOCJLizgIS4s4AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm66WAJuulgabrpYam66WQpuu
+ lX+Uqo3BgKF17GKTU/RGhjLkM30cvih4D4IldwxBLnwWFUKFLQZLiTgDUYw/AVKMQABSjEAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmZWQBpmVkLaZlZMGeYWG5ll1WtYZVR3lyT
+ SvdVj0L0UI090E6MOpJNjDpTTYw5Ik2MOQhNjDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACdrpgAna6YBZ2umBedrpg7na6XcJWqjqx/oHXWYJJQ5kWGMd40fh7CLXsVkDF9
+ GlVBhCsqTYo6FVCLPgtSjEAEU4xBAVuQSgBllVYAZZVWAGWVVgBllVYApLSfAKS0nwCktJ8AoLKaAJeu
+ kACJp4AAY5ZSAV2TTAtdk0wwXZNMblyTS61akkneWJFG91aQQ/RUj0HQU49AklOPQFNSj0AiUo9ACFKP
+ QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+vmgCfr5oEn6+aEp+v
+ mi2erplWlKqNhnuecLBbkEvMQ4Uv1Td/Ick1fh6oPYInekiHNFFPijwyUYw/HFSNQgxZj0gEY5RUAWWV
+ VgBllVYAZZVWAGWVVgCktJ8ApLSfAKS0nwGgspoBl66QAomngANwm2IEUo1ADk+MPDNQjDxwUY0+rlOO
+ QN1Vj0P2WJFG8luSSc1ck0qRXJNLUlyTSyJck0sHXJNLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAn6+aAJ+vmgKfr5oLn6+aHJ+umTaRqIlYcppmglSNQ6xChS7JO4Em0zyC
+ J8ZDhS6pSog2gk6KO1lRiz42VY5EHF2RTQtklVUEZZVWAWWVVgBllVYAZZVWAKS0nwCktJ8BpLSfA6Cy
+ mgeXrpALiaeADnKdZhBRjD4aRIYvPUOGLndGhzGxS4o33FOOQPBck0vqY5ZTxGaYV4pnmVhOaJlZIGiZ
+ WQdomVkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgr5sAoK+bAaCv
+ mwWgr5sMnq6ZF4ejfS1klFZWT4o9jkaGM79DhS/bQ4Uv40WGMdVHhzSzS4k4hlCLPlpXj0Y2X5JPHGSV
+ VQtllVYDZZVWAGWVVgBllVYApLSfAKS0nwKktJ8JoLKaFJeukCCJp4Aoc51mLVSOQjdAhCpVO4Ilhz6D
+ KLhEhzDZUI095F+UT9VrmlyucJ1jeXKeZUV0nmccdJ9nBnSfZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCvmwCgr5sAoK+bAaCvmwOarJQFcppmE16RTzxXjkd8U4xCuE6K
+ PeFJhzb0Q4Uv8UKELdlHhzOyT4s9iFiPSF9gk1A5ZJRUGmKUUghZj0gCS4k4AUKELQBckUwBm7CUBaGz
+ nBWesZkvlq6PSYinf1xznWZmV5BGb0KFLoU7giWoO4IlxkGEK9NMijnKXpNNrW6bYIR2oGpZeaFuMnui
+ cBR8onAEfKJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoK+bAKCv
+ mwCgr5sAoK+bAH2fcwFvmGILbphhM2uWXnJllFevXJBM20+KPfNChC34PoIo7kSFMNhOijy5Vo5FkluQ
+ SmNYj0Y1Sok3GD6DKA4/gykNQYQsDESFLwxklVUThqZ9LJCqiFaNqYR/gqR4nm+bYq5XkEa1RYcxvz6D
+ Kcs9gyfQP4QqxUeIM6ZWkEV4aZlaTnWfaTB7om8afqRzCn+kdAJ/pHQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfp90AH6fdAl+n3Qqep1vX3Ka
+ ZpVmlFjAVo1G3keGNPBChC72RoYy70yJOdxPijy9TYo6kUWGMGI6gSRDOYEjOT6DKDdBhC03QoQuN0uJ
+ OD5ilFJZcpxlhHaearBxm2TQZJVV4VONQeRGhzLgQYQs1j+EKsM/hCqlQ4YuekuKOElbkkslbJpeE3eg
+ awl+pHMDf6R0AX+kdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACFonwAhaJ8BoWifBuAoHdAeJxtam2XYJNgkVG6VYxE3E6JPO9LiDjxSIc16EWG
+ MdVAhCu4OoEkmDeAIIQ7gSV9QYQse0SFMHtEhTB7RoYygU2KO5RWj0WzW5FL0VuRSudVjkPyTYo670aH
+ Mt1DhS6/QYQsnECEK3ZBhSxORIYwKU2LOxFdk00HbZtfA32jcgF/pHQAf6R0AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIejfwCHo38Dh6N/DoKh
+ eSN6nXBAcplmZGqWXY9jklS5Wo5K01CKPtpHhjPYQIMr0zyBJss7gSXCPYIovEKFLrtHhzO6SYg2ukqI
+ N7pJhza9Sog2x0yJOddNijvmTYo77UyJOexJiDXeRocywkSGMJlDhS9vQYUtSUCELCpBhS0URocyB1CM
+ PgJflFABeqFuAH+kdAB/pHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAiaSBAImkgQGIpIAGg6F6EHyeciJ3m2w9c5pnY26XYYpjklSjVIxDq0eG
+ M7BAgyu5QIMrxkSFMNRJiDbdTYk64FCLPuFRiz/hUYs/4VCLPuJPij3mT4o97E+KPe1OijzmTIk51kqI
+ N7tHhzSXRoczbkWGMUdDhi8oQYUsEz+EKghAhCsDQYUsAUWHMQBhlVIAf6R0AH+kdAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJpIEAiaSBAIik
+ gAGCoXgFfp9zDnyecSB6nXA5dptqVWmVXGZXjUZuSoc2eUeGMoxMiTmqVIxCzFiOSOJaj0rqW49K61uP
+ S+xaj0rsWo9J7FqPSe1bj0vsXJBL5FuQStJYjke0UoxAjUyKOmVJiDZDR4g0J0aHMhJDhi8GQIQrAj+E
+ KgE/hCoAP4QqAD+EKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAImkgQCJpIEAhKJ7AH+fdgF/n3UFf591DH6fdBh6nW8kbJZfLVqO
+ STJSi0A/V41GWWCSUYBnlVmsaZZbyWiVWtNmlFjVZZRW1WSTVdVkk1XVZpRY1WqWXNJtmGDHb5lisGyY
+ X4lklFZbWI9HNk+LPR9KiTgQSIg1BkeINAFDhi8AP4QqAD+EKgA/hCoAP4QqAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB/n3UAf591AH+fdQF/n3UDf591BXqdbwhtl18KYZFRDWWTVxlumGEvdJpoUneba3l1m2qScplmm26Y
+ Ypxsl1+ca5ZdnGuWXpxvmGKcdptqmnuecZB/oHV7gKF2WXyfcTJwmWMWX5JQCVONQQRJiTYBSIg1AEiI
+ NQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+fdQB/n3UAf591AH+fdQB/n3UAep1vAG+Y
+ YwB4nG0CfJ5yCH6ecxV+n3QpfZ5zP3udcE12m2pScpllU2+YYlNtl2BTbphhU3OaZ1N6nW9RgaF3TIaj
+ fkCKpYEti6WCF4mlgQiEo3sCep5vAFaORQBIiDUASIg1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf591AH+fdQF/n3UDf591B3+fdQ9+n3QXe51wHHab
+ ax5ymWYeb5hiHm2XYR5umGIec5pnHnqdcB2CoXgbh6R+F4qlghCMpoQIjKaEA4ymhAGMpoQAjKaEAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB/n3UAf591AH+fdQF/n3UCf591BH6fdAZ7nXAIdptrCHKZZghvmGIIbZdhCG6YYghzmmcIep1wCIKh
+ eAeHpH4GiqWCBIymhAKMpoQBjKaEAIymhACMpoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+fdQB/n3UAf591AH+fdQB/n3UBfp90AXud
+ cAJ2m2sCcplmAm+YYgJtl2ECbphiAnOaZwJ6nXACgqF4AoekfgGKpYIBjKaEAIymhACMpoQAjKaEAIym
+ hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAf591AH+fdQB/n3UAf591AH+fdQB+n3QAe51wAHabawBymWYAb5hiAG2XYQBumGIAc5pnAHqd
+ cACCoXgAh6R+AIqlggCMpoQAjKaEAIymhACMpoQAjKaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA/////////////gB///////////////////wAP//////////////////A
+ AAP/////////////////gAAB/////////////////wAAAP////////////////8AAAD/////////////
+ ///4AAAAP///////////////8AAAAB////////////////AAAAAP///////////////wAAAAD///////
+ ///8AB//8AAAAA//////////8AAH//AAAAAP/////////+AAA//wAHwAD//////////AAAP/8AD8AA//
+ //////8AAAAAB/AD/AAP///////+AAAAAAPwA/wAD///////+AAAAAAAEAH+AA////////AAAAAAAAAA
+ /AAP///////AAAAAAAAAAHwAD///////AAAAAAAAAAA4AA///////AAAAAAAAAAAAAAP//////wAAAAA
+ AAAAAAAAD//////wAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAP//////A
+ AAAAAAAAAAAAAH//////wAAAAAAAAAAAAAD//////8AAAAAAAAAAAAAB//////+AAAAAAAAAAAAAB///
+ ////AAAAAAAAAAAAAA///////AAAAAAAAAAAAD////////gAAAAAAAAAAAA////////wAAAAAAAAAAAA
+ P///////8AAAAAAAAAAAAD////////AAAAAAAAAAAAA////////wAAAAAAAAAAAAP///////8AAAAAAA
+ AAAAAB////////AAAAAAAAAAAAAP///////wAAAAAAAAAAAAD///////8AAAAAAAAAAAAA///////+AA
+ AAAAAAAAAAAP///////AAAAAAAAAAAAAD///////wAAAAAAAAAAAAA///////8AAAAAAAAAAAAAP////
+ ///AAAAAAAAAAAAAD///////wAAAAAAAAAAAAAf//////8AAAAAAAAAAAAAAD/4AD//AAAAAAAAAAAAA
+ AAf8AAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAD/wAAAAAAA
+ AAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAA//AA
+ AAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAPwAAA
+ AP/wAAAAAAAAAAAAD+AAAAD/8AAAAAAAAAAAAA/+AAAA//AAAAAAAAAAAAAP/wAAAP/wAAAAAAAAAAAA
+ H/8AAAD/8AAAAAAAAAAAAD//AAAA//gAAAAAAAAAAAB//wAAAP/8AAAAAAAAAAAAf/+AAAH//wAAAAAA
+ AAAAAH//wAAD//8AAAAAAAAAAAD//+AAD///AAAAAAAAAAAD///8AD///wAAAAAAAAAAA////AA///+A
+ AAAAAAAAAAf///4Af///wAAAAAAAAAAP////AP///+AAAAAAAAAAH//////////wAAAAAAAAAB//////
+ /////AAAAAAAAAAf//////////4AAAAAAAAAH///////////AAAAAAAAAAf//////////4AAAAAAAAAD
+ ///////////AAAAAAAAAA///////////4AAAAAAAAAP///////////4AAAAAAAAD////////////AAAA
+ AAAAAf////////////8AAAD/gAD/////////////gAAA/8AAf//////////////////AAH//////////
+ ////////wAA//////////////////8AAP//////////////////gAD//////////////////8AA/////
+ //////////////AAAB/////////////////wAAAP////////////////8AAAB/////////////////AA
+ AAH////////////////wAAAA////////////////4AAAAH///////////////8AAAAAf////////////
+ ///AAAAAH///////////////wAAAAA///////////////8AAAAAH//////////////+AAAAAA///////
+ ///////+AAAYAAP//////////////AAAfAAD//////////////wAAP4AA//////////////8AAH/AAP/
+ /////////////AAD/8AD//////////////wAB//AA//////////////8AB//wAP//////////////AAf
+ /8AD//////////////wAB//AA//////////////8AAP/gAP//////////////AAB+AAD////////////
+ //wAAPAAA//////////////8AADwAAP//////////////gAAIAAD//////////////+AAAAAA///////
+ ////////wAAAAAP//////////////8AAAAAH///////////////AAAAAD///////////////wAAAAB//
+ /////////////+AAAAA////////////////wAAAA////////////////+AAAAf/////////////////A
+ AAf/////////////////wAAH/////////////////+AAD//////////////////4AD//////////////
+ //////////////////////////////////8=
+
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormPGN.cs b/Source/Forms/FormPGN.cs
new file mode 100644
index 0000000..4ab2901
--- /dev/null
+++ b/Source/Forms/FormPGN.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormPGN: Form
+ {
+ public FormPGN()
+ {
+ InitializeComponent();
+ }
+
+ private void btnSerialOK_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormPGN.designer.cs b/Source/Forms/FormPGN.designer.cs
new file mode 100644
index 0000000..14448e2
--- /dev/null
+++ b/Source/Forms/FormPGN.designer.cs
@@ -0,0 +1,135 @@
+namespace AgTwo
+{
+ partial class FormPGN
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPGN));
+ this.lblMessage2 = new System.Windows.Forms.Label();
+ this.btnSerialOK = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // lblMessage2
+ //
+ this.lblMessage2.AutoSize = true;
+ this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblMessage2.ForeColor = System.Drawing.Color.White;
+ this.lblMessage2.Location = new System.Drawing.Point(12, 9);
+ this.lblMessage2.Name = "lblMessage2";
+ this.lblMessage2.Size = new System.Drawing.Size(40, 19);
+ this.lblMessage2.TabIndex = 1;
+ this.lblMessage2.Text = "PGN";
+ //
+ // btnSerialOK
+ //
+ this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnSerialOK.FlatAppearance.BorderSize = 0;
+ this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64;
+ this.btnSerialOK.Location = new System.Drawing.Point(234, 446);
+ this.btnSerialOK.Name = "btnSerialOK";
+ this.btnSerialOK.Size = new System.Drawing.Size(57, 64);
+ this.btnSerialOK.TabIndex = 96;
+ this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft;
+ this.btnSerialOK.UseVisualStyleBackColor = true;
+ this.btnSerialOK.Click += new System.EventHandler(this.btnSerialOK_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.ForeColor = System.Drawing.Color.White;
+ this.label1.Location = new System.Drawing.Point(71, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(88, 19);
+ this.label1.TabIndex = 97;
+ this.label1.Text = "Description";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.ForeColor = System.Drawing.Color.White;
+ this.label2.Location = new System.Drawing.Point(12, 42);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(36, 475);
+ this.label2.TabIndex = 98;
+ this.label2.Text = "254\r\n253\r\n252\r\n251\r\n250\r\n\r\n239\r\n238\r\n237\r\n236\r\n235\r\n234\r\n229\r\n\r\n203\r\n202\r\n201\r\n\r\n" +
+ "200\r\n126\r\n123\r\n121\r\n120\r\n\r\n\r\n";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.ForeColor = System.Drawing.Color.White;
+ this.label3.Location = new System.Drawing.Point(56, 41);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(181, 437);
+ this.label3.TabIndex = 99;
+ this.label3.Text = resources.GetString("label3.Text");
+ //
+ // FormPGN
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.Black;
+ this.ClientSize = new System.Drawing.Size(287, 506);
+ this.ControlBox = false;
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.btnSerialOK);
+ this.Controls.Add(this.lblMessage2);
+ this.Font = new System.Drawing.Font("Tahoma", 14.25F);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Margin = new System.Windows.Forms.Padding(6);
+ this.Name = "FormPGN";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "PGN Guide";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Label lblMessage2;
+ private System.Windows.Forms.Button btnSerialOK;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormPGN.resx b/Source/Forms/FormPGN.resx
new file mode 100644
index 0000000..d342296
--- /dev/null
+++ b/Source/Forms/FormPGN.resx
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Steer Data
+From AutoSteer Module
+Steer Settings
+Steer Config
+From AutoSteer Sensors
+
+Machine Data
+Machine Config
+From Machine Module
+Pin Config
+Section Dimensions
+Matt Switch Module
+64 Section On Off
+
+Subnet Scan Reply
+Scan Request
+Set Subnet
+
+Hello Sent To All
+Hello Steer Reply
+Hello Machine Reply
+Hello IMU Reply
+Hello GPS Reply
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormSteerGraph.Designer.cs b/Source/Forms/FormSteerGraph.Designer.cs
new file mode 100644
index 0000000..769018c
--- /dev/null
+++ b/Source/Forms/FormSteerGraph.Designer.cs
@@ -0,0 +1,247 @@
+namespace Drive
+{
+ partial class FormSteerGraph
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.unoChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.lblPWM = new System.Windows.Forms.Label();
+ this.lblSteerAng = new System.Windows.Forms.Label();
+ this.btnAuto = new System.Windows.Forms.Button();
+ this.btnMinus = new System.Windows.Forms.Button();
+ this.btnPlus = new System.Windows.Forms.Button();
+ this.lblGain = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.unoChart)).BeginInit();
+ this.SuspendLayout();
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 200;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // unoChart
+ //
+ this.unoChart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.unoChart.AntiAliasing = System.Windows.Forms.DataVisualization.Charting.AntiAliasingStyles.None;
+ this.unoChart.BackColor = System.Drawing.Color.Black;
+ chartArea1.AxisX.LabelAutoFitMaxFontSize = 8;
+ chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.DimGray;
+ chartArea1.AxisY.LineWidth = 2;
+ chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.DimGray;
+ chartArea1.BackColor = System.Drawing.Color.Black;
+ chartArea1.BorderWidth = 0;
+ chartArea1.Name = "ChartArea1";
+ chartArea1.Position.Auto = false;
+ chartArea1.Position.Height = 100F;
+ chartArea1.Position.Width = 100F;
+ this.unoChart.ChartAreas.Add(chartArea1);
+ this.unoChart.Location = new System.Drawing.Point(3, 3);
+ this.unoChart.Margin = new System.Windows.Forms.Padding(0);
+ this.unoChart.Name = "unoChart";
+ this.unoChart.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None;
+ series1.BackSecondaryColor = System.Drawing.Color.White;
+ series1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(255)))));
+ series1.BorderWidth = 2;
+ series1.ChartArea = "ChartArea1";
+ series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine;
+ series1.Color = System.Drawing.Color.OrangeRed;
+ series1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ series1.Legend = "Legend1";
+ series1.Name = "S";
+ series2.BorderWidth = 2;
+ series2.ChartArea = "ChartArea1";
+ series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.FastLine;
+ series2.Color = System.Drawing.Color.Lime;
+ series2.IsVisibleInLegend = false;
+ series2.Legend = "Legend1";
+ series2.Name = "PWM";
+ this.unoChart.Series.Add(series1);
+ this.unoChart.Series.Add(series2);
+ this.unoChart.Size = new System.Drawing.Size(648, 182);
+ this.unoChart.TabIndex = 180;
+ this.unoChart.TextAntiAliasingQuality = System.Windows.Forms.DataVisualization.Charting.TextAntiAliasingQuality.SystemDefault;
+ //
+ // label5
+ //
+ this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.label5.AutoEllipsis = true;
+ this.label5.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.label5.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label5.ForeColor = System.Drawing.SystemColors.ButtonHighlight;
+ this.label5.Location = new System.Drawing.Point(107, 185);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(122, 23);
+ this.label5.TabIndex = 196;
+ this.label5.Text = "SetPoint";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
+ // label1
+ //
+ this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.label1.AutoEllipsis = true;
+ this.label1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.ForeColor = System.Drawing.SystemColors.ButtonHighlight;
+ this.label1.Location = new System.Drawing.Point(310, 185);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(105, 23);
+ this.label1.TabIndex = 195;
+ this.label1.Text = "Actual";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
+ // lblPWM
+ //
+ this.lblPWM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.lblPWM.AutoSize = true;
+ this.lblPWM.BackColor = System.Drawing.SystemColors.ControlText;
+ this.lblPWM.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblPWM.ForeColor = System.Drawing.Color.Lime;
+ this.lblPWM.Location = new System.Drawing.Point(230, 185);
+ this.lblPWM.Name = "lblPWM";
+ this.lblPWM.Size = new System.Drawing.Size(68, 23);
+ this.lblPWM.TabIndex = 194;
+ this.lblPWM.Text = "label5";
+ this.lblPWM.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lblSteerAng
+ //
+ this.lblSteerAng.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.lblSteerAng.AutoSize = true;
+ this.lblSteerAng.BackColor = System.Drawing.SystemColors.ControlText;
+ this.lblSteerAng.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSteerAng.ForeColor = System.Drawing.Color.OrangeRed;
+ this.lblSteerAng.Location = new System.Drawing.Point(421, 185);
+ this.lblSteerAng.Name = "lblSteerAng";
+ this.lblSteerAng.Size = new System.Drawing.Size(68, 23);
+ this.lblSteerAng.TabIndex = 193;
+ this.lblSteerAng.Text = "label1";
+ this.lblSteerAng.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // btnAuto
+ //
+ this.btnAuto.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btnAuto.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnAuto.Location = new System.Drawing.Point(3, 69);
+ this.btnAuto.Name = "btnAuto";
+ this.btnAuto.Size = new System.Drawing.Size(41, 70);
+ this.btnAuto.TabIndex = 237;
+ this.btnAuto.Text = "A\r\nu\r\nt\r\no";
+ this.btnAuto.UseVisualStyleBackColor = true;
+ this.btnAuto.Click += new System.EventHandler(this.btnAuto_Click);
+ //
+ // btnMinus
+ //
+ this.btnMinus.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btnMinus.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnMinus.Location = new System.Drawing.Point(3, 145);
+ this.btnMinus.Name = "btnMinus";
+ this.btnMinus.Size = new System.Drawing.Size(41, 61);
+ this.btnMinus.TabIndex = 236;
+ this.btnMinus.Text = "-";
+ this.btnMinus.UseVisualStyleBackColor = true;
+ this.btnMinus.Click += new System.EventHandler(this.btnMinus_Click);
+ //
+ // btnPlus
+ //
+ this.btnPlus.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.btnPlus.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnPlus.Location = new System.Drawing.Point(3, 2);
+ this.btnPlus.Name = "btnPlus";
+ this.btnPlus.Size = new System.Drawing.Size(41, 61);
+ this.btnPlus.TabIndex = 235;
+ this.btnPlus.Text = "+";
+ this.btnPlus.UseVisualStyleBackColor = true;
+ this.btnPlus.Click += new System.EventHandler(this.btnPlus_Click);
+ //
+ // lblGain
+ //
+ this.lblGain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.lblGain.AutoEllipsis = true;
+ this.lblGain.AutoSize = true;
+ this.lblGain.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.lblGain.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblGain.ForeColor = System.Drawing.SystemColors.ButtonHighlight;
+ this.lblGain.Location = new System.Drawing.Point(51, 185);
+ this.lblGain.Name = "lblGain";
+ this.lblGain.Size = new System.Drawing.Size(40, 23);
+ this.lblGain.TabIndex = 239;
+ this.lblGain.Text = "215";
+ this.lblGain.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ //
+ // FormSteerGraph
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+ this.ClientSize = new System.Drawing.Size(656, 211);
+ this.Controls.Add(this.lblGain);
+ this.Controls.Add(this.btnAuto);
+ this.Controls.Add(this.btnMinus);
+ this.Controls.Add(this.btnPlus);
+ this.Controls.Add(this.lblPWM);
+ this.Controls.Add(this.lblSteerAng);
+ this.Controls.Add(this.label5);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.unoChart);
+ this.Location = new System.Drawing.Point(30, 30);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FormSteerGraph";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "AutoSteer Graph";
+ this.TopMost = true;
+ this.Load += new System.EventHandler(this.FormSteerGraph_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.unoChart)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.DataVisualization.Charting.Chart unoChart;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lblPWM;
+ private System.Windows.Forms.Label lblSteerAng;
+ private System.Windows.Forms.Button btnAuto;
+ private System.Windows.Forms.Button btnMinus;
+ private System.Windows.Forms.Button btnPlus;
+ private System.Windows.Forms.Label lblGain;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormSteerGraph.cs b/Source/Forms/FormSteerGraph.cs
new file mode 100644
index 0000000..d6dbe78
--- /dev/null
+++ b/Source/Forms/FormSteerGraph.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Globalization;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+
+namespace Drive
+{
+ public partial class FormSteerGraph : Form
+ {
+ private readonly FormGPS mf = null;
+
+ //chart data
+ private string dataSteerAngle = "0";
+
+ private string dataPWM = "-1";
+
+ public FormSteerGraph(Form callingForm)
+ {
+ mf = callingForm as FormGPS;
+ InitializeComponent();
+
+ this.label5.Text = gStr.gsSetPoint;
+ this.label1.Text = gStr.gsActual;
+
+ this.Text = gStr.gsSteerChart;
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ DrawChart();
+ }
+
+ private void DrawChart()
+ {
+ {
+ //word 0 - steerangle, 1 - pwmDisplay
+ dataSteerAngle = mf.mc.actualSteerAngleChart.ToString();
+ dataPWM = mf.guidanceLineSteerAngle.ToString();
+
+ lblSteerAng.Text = mf.ActualSteerAngle;
+ lblPWM.Text = mf.SetSteerAngle;
+ }
+
+ //chart data
+ Series s = unoChart.Series["S"];
+ Series w = unoChart.Series["PWM"];
+ double nextX = 1;
+ double nextX5 = 1;
+
+ if (s.Points.Count > 0) nextX = s.Points[s.Points.Count - 1].XValue + 1;
+ if (w.Points.Count > 0) nextX5 = w.Points[w.Points.Count - 1].XValue + 1;
+
+ unoChart.Series["S"].Points.AddXY(nextX, dataSteerAngle);
+ unoChart.Series["PWM"].Points.AddXY(nextX5, dataPWM);
+
+ //if (isScroll)
+ {
+ while (s.Points.Count > 50)
+ {
+ s.Points.RemoveAt(0);
+ }
+ while (w.Points.Count > 50)
+ {
+ w.Points.RemoveAt(0);
+ }
+ unoChart.ChartAreas[0].RecalculateAxesScale();
+ }
+
+ lblGain.Text = ((int)(Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum*0.01) + Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum*0.01))).ToString();
+ }
+
+ private void FormSteerGraph_Load(object sender, EventArgs e)
+ {
+ timer1.Interval = (int)((1 / (double)mf.fixUpdateHz) * 1000);
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
+
+ private void btnAuto_Click(object sender, EventArgs e)
+ {
+ unoChart.ChartAreas[0].AxisY.Maximum = Double.NaN;
+ unoChart.ChartAreas[0].AxisY.Minimum = Double.NaN;
+ unoChart.ChartAreas[0].RecalculateAxesScale();
+ unoChart.ResetAutoValues();
+ }
+
+ private void btnPlus_Click(object sender, EventArgs e)
+ {
+ if (Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum) > Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum))
+ unoChart.ChartAreas[0].AxisY.Maximum = Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum);
+ else unoChart.ChartAreas[0].AxisY.Minimum = Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum) * -1;
+ unoChart.ChartAreas[0].AxisY.Minimum *=1.5;
+ unoChart.ChartAreas[0].AxisY.Maximum *=1.5;
+
+ unoChart.ChartAreas[0].AxisY.Minimum = (int)unoChart.ChartAreas[0].AxisY.Minimum;
+ unoChart.ChartAreas[0].AxisY.Maximum = (int)unoChart.ChartAreas[0].AxisY.Maximum;
+
+ unoChart.ResetAutoValues();
+
+ }
+
+ private void btnMinus_Click(object sender, EventArgs e)
+ {
+ if (Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum) > Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum))
+ unoChart.ChartAreas[0].AxisY.Maximum = Math.Abs(unoChart.ChartAreas[0].AxisY.Minimum);
+ else unoChart.ChartAreas[0].AxisY.Minimum = Math.Abs(unoChart.ChartAreas[0].AxisY.Maximum) * -1;
+
+ unoChart.ChartAreas[0].AxisY.Minimum *=0.75;
+ unoChart.ChartAreas[0].AxisY.Maximum *=0.75;
+
+ if (unoChart.ChartAreas[0].AxisY.Maximum <=100)
+ {
+ unoChart.ChartAreas[0].AxisY.Maximum = 100;
+ unoChart.ChartAreas[0].AxisY.Minimum = -100;
+ }
+
+ unoChart.ChartAreas[0].AxisY.Minimum = (int)unoChart.ChartAreas[0].AxisY.Minimum;
+ unoChart.ChartAreas[0].AxisY.Maximum = (int)unoChart.ChartAreas[0].AxisY.Maximum;
+
+ unoChart.ResetAutoValues();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormSteerGraph.resx b/Source/Forms/FormSteerGraph.resx
new file mode 100644
index 0000000..1f666f2
--- /dev/null
+++ b/Source/Forms/FormSteerGraph.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormTimedMessage.Designer.cs b/Source/Forms/FormTimedMessage.Designer.cs
new file mode 100644
index 0000000..419c298
--- /dev/null
+++ b/Source/Forms/FormTimedMessage.Designer.cs
@@ -0,0 +1,92 @@
+namespace AgTwo
+{
+ partial class FormTimedMessage
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.lblTitle = new System.Windows.Forms.Label();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.lblMessage2 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // lblMessage
+ //
+ this.lblTitle.AutoSize = true;
+ this.lblTitle.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold);
+ this.lblTitle.Location = new System.Drawing.Point(12, 20);
+ this.lblTitle.Name = "lblMessage";
+ this.lblTitle.Size = new System.Drawing.Size(115, 29);
+ this.lblTitle.TabIndex = 0;
+ this.lblTitle.Text = "Message";
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 3000;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // lblMessage2
+ //
+ this.lblMessage2.AutoSize = true;
+ this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F);
+ this.lblMessage2.Location = new System.Drawing.Point(75, 71);
+ this.lblMessage2.Name = "lblMessage2";
+ this.lblMessage2.Size = new System.Drawing.Size(127, 29);
+ this.lblMessage2.TabIndex = 1;
+ this.lblMessage2.Text = "Message 2";
+ //
+ // FormTimedMessage
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.LightSalmon;
+ this.ClientSize = new System.Drawing.Size(272, 151);
+ this.ControlBox = false;
+ this.Controls.Add(this.lblMessage2);
+ this.Controls.Add(this.lblTitle);
+ this.Font = new System.Drawing.Font("Tahoma", 14.25F);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Margin = new System.Windows.Forms.Padding(6);
+ this.Name = "FormTimedMessage";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "AgTwo Message";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblTitle;
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Label lblMessage2;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormTimedMessage.cs b/Source/Forms/FormTimedMessage.cs
new file mode 100644
index 0000000..f3e9fce
--- /dev/null
+++ b/Source/Forms/FormTimedMessage.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormTimedMessage : Form
+ {
+ public FormTimedMessage(int timeInMsec, string titleStr, string messageStr)
+ {
+ InitializeComponent();
+
+ lblTitle.Text = titleStr;
+ lblMessage2.Text = messageStr;
+
+ timer1.Interval = timeInMsec;
+
+ int messWidth = messageStr.Length;
+ Width = messWidth * 15 + 120;
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ timer1.Enabled = false;
+ timer1.Dispose();
+ Dispose();
+ Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormYes.cs b/Source/Forms/FormYes.cs
new file mode 100644
index 0000000..4a67ac9
--- /dev/null
+++ b/Source/Forms/FormYes.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormYes : Form
+ {
+ public FormYes(string messageStr)
+ {
+ InitializeComponent();
+
+ lblMessage2.Text = messageStr;
+
+ int messWidth = messageStr.Length;
+ Width = messWidth * 15 + 180;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormYes.designer.cs b/Source/Forms/FormYes.designer.cs
new file mode 100644
index 0000000..bd7b1d7
--- /dev/null
+++ b/Source/Forms/FormYes.designer.cs
@@ -0,0 +1,89 @@
+namespace AgTwo
+{
+ partial class FormYes
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblMessage2 = new System.Windows.Forms.Label();
+ this.btnSerialOK = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // lblMessage2
+ //
+ this.lblMessage2.AutoSize = true;
+ this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold);
+ this.lblMessage2.Location = new System.Drawing.Point(46, 71);
+ this.lblMessage2.Name = "lblMessage2";
+ this.lblMessage2.Size = new System.Drawing.Size(137, 29);
+ this.lblMessage2.TabIndex = 1;
+ this.lblMessage2.Text = "Message 2";
+ //
+ // btnSerialOK
+ //
+ this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnSerialOK.FlatAppearance.BorderSize = 0;
+ this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64;
+ this.btnSerialOK.Location = new System.Drawing.Point(136, 161);
+ this.btnSerialOK.Name = "btnSerialOK";
+ this.btnSerialOK.Size = new System.Drawing.Size(105, 64);
+ this.btnSerialOK.TabIndex = 96;
+ this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft;
+ this.btnSerialOK.UseVisualStyleBackColor = true;
+ //
+ // FormYes
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
+ this.ClientSize = new System.Drawing.Size(245, 229);
+ this.ControlBox = false;
+ this.Controls.Add(this.btnSerialOK);
+ this.Controls.Add(this.lblMessage2);
+ this.Font = new System.Drawing.Font("Tahoma", 14.25F);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Margin = new System.Windows.Forms.Padding(6);
+ this.Name = "FormYes";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "AgTwo Message";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Label lblMessage2;
+ private System.Windows.Forms.Button btnSerialOK;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormYes.resx b/Source/Forms/FormYes.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/Source/Forms/FormYes.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormYesNo.cs b/Source/Forms/FormYesNo.cs
new file mode 100644
index 0000000..89a49cc
--- /dev/null
+++ b/Source/Forms/FormYesNo.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ public partial class FormYesNo : Form
+ {
+ public FormYesNo(string messageStr)
+ {
+ InitializeComponent();
+
+ lblMessage2.Text = messageStr;
+
+ int messWidth = messageStr.Length;
+ Width = messWidth * 15 + 180;
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ timer1.Enabled = false;
+ timer1.Dispose();
+ Dispose();
+ Close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormYesNo.designer.cs b/Source/Forms/FormYesNo.designer.cs
new file mode 100644
index 0000000..a3486e0
--- /dev/null
+++ b/Source/Forms/FormYesNo.designer.cs
@@ -0,0 +1,116 @@
+namespace AgTwo
+{
+ partial class FormYesNo
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.lblMessage2 = new System.Windows.Forms.Label();
+ this.btnSerialCancel = new System.Windows.Forms.Button();
+ this.btnSerialOK = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 3000;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // lblMessage2
+ //
+ this.lblMessage2.AutoSize = true;
+ this.lblMessage2.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Bold);
+ this.lblMessage2.Location = new System.Drawing.Point(46, 71);
+ this.lblMessage2.Name = "lblMessage2";
+ this.lblMessage2.Size = new System.Drawing.Size(137, 29);
+ this.lblMessage2.TabIndex = 1;
+ this.lblMessage2.Text = "Message 2";
+ //
+ // btnSerialCancel
+ //
+ this.btnSerialCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSerialCancel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.btnSerialCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnSerialCancel.FlatAppearance.BorderSize = 0;
+ this.btnSerialCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnSerialCancel.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSerialCancel.Image = global::AgTwo.Properties.Resources.Cancel64;
+ this.btnSerialCancel.Location = new System.Drawing.Point(8, 161);
+ this.btnSerialCancel.Name = "btnSerialCancel";
+ this.btnSerialCancel.Size = new System.Drawing.Size(105, 64);
+ this.btnSerialCancel.TabIndex = 97;
+ this.btnSerialCancel.UseVisualStyleBackColor = true;
+ //
+ // btnSerialOK
+ //
+ this.btnSerialOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSerialOK.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.btnSerialOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnSerialOK.FlatAppearance.BorderSize = 0;
+ this.btnSerialOK.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnSerialOK.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSerialOK.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.btnSerialOK.Image = global::AgTwo.Properties.Resources.OK64;
+ this.btnSerialOK.Location = new System.Drawing.Point(136, 161);
+ this.btnSerialOK.Name = "btnSerialOK";
+ this.btnSerialOK.Size = new System.Drawing.Size(105, 64);
+ this.btnSerialOK.TabIndex = 96;
+ this.btnSerialOK.TextAlign = System.Drawing.ContentAlignment.TopLeft;
+ this.btnSerialOK.UseVisualStyleBackColor = true;
+ //
+ // FormYesNo
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 23F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
+ this.ClientSize = new System.Drawing.Size(253, 237);
+ this.ControlBox = false;
+ this.Controls.Add(this.btnSerialCancel);
+ this.Controls.Add(this.btnSerialOK);
+ this.Controls.Add(this.lblMessage2);
+ this.Font = new System.Drawing.Font("Tahoma", 14.25F);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Margin = new System.Windows.Forms.Padding(6);
+ this.Name = "FormYesNo";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "AgTwo Message";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Label lblMessage2;
+ private System.Windows.Forms.Button btnSerialCancel;
+ private System.Windows.Forms.Button btnSerialOK;
+ }
+}
\ No newline at end of file
diff --git a/Source/Forms/FormYesNo.resx b/Source/Forms/FormYesNo.resx
new file mode 100644
index 0000000..1f666f2
--- /dev/null
+++ b/Source/Forms/FormYesNo.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/Source/Forms/FormtimedMessage.resx b/Source/Forms/FormtimedMessage.resx
new file mode 100644
index 0000000..1f666f2
--- /dev/null
+++ b/Source/Forms/FormtimedMessage.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/Source/Forms/NMEA.Designer.cs b/Source/Forms/NMEA.Designer.cs
new file mode 100644
index 0000000..213a388
--- /dev/null
+++ b/Source/Forms/NMEA.Designer.cs
@@ -0,0 +1,998 @@
+using System;
+using System.Globalization;
+
+namespace AgTwo
+{
+ public partial class FormLoop
+ {
+ private string rawBuffer = "";
+ private string[] words;
+ private string nextNMEASentence = "";
+
+ private bool isNMEAToSend = false;
+
+ public string ggaSentence, vtgSentence, hdtSentence, avrSentence, paogiSentence,
+ hpdSentence, rmcSentence, pandaSentence, ksxtSentence;
+
+ public float hdopData, altitude = float.MaxValue, headingTrue = float.MaxValue,
+ headingTrueDual = float.MaxValue, speed = float.MaxValue, roll = float.MaxValue;
+ public float altitudeData, speedData, rollData, headingTrueData, headingTrueDualData, ageData;
+
+ public double latitudeSend = double.MaxValue, longitudeSend = double.MaxValue, latitude, longitude;
+
+ public ushort satellitesData, satellitesTracked = ushort.MaxValue, hdopX100 = ushort.MaxValue,
+ ageX100 = ushort.MaxValue;
+
+ //imu data
+ public ushort imuHeadingData, imuHeading = ushort.MaxValue;
+ public short imuRollData, imuRoll = short.MaxValue, imuPitchData, imuPitch = short.MaxValue,
+ imuYawRateData, imuYawRate = short.MaxValue;
+
+ public byte fixQualityData, fixQuality = byte.MaxValue;
+
+ private float rollK, Pc, G, Xp, Zp, XeRoll, P = 1.0f;
+ private readonly float varRoll = 0.1f, varProcess = 0.0003f;
+
+ double LastUpdateUTC = 0;
+
+ //Convert Fix value to Text
+ public string FixQuality
+ {
+ get
+ {
+ if (fixQualityData == 0) return "Invalid: ";
+ else if (fixQualityData == 1) return "GPS 1: ";
+ else if (fixQualityData == 2) return "DGPS : ";
+ else if (fixQualityData == 3) return "PPS : ";
+ else if (fixQualityData == 4) return "RTK fix: ";
+ else if (fixQualityData == 5) return "Float: ";
+ else if (fixQualityData == 6) return "Estimate: ";
+ else if (fixQualityData == 7) return "Man IP: ";
+ else if (fixQualityData == 8) return "Sim: ";
+ else return "Unknown: ";
+ }
+ }
+
+ public string Parse(ref string buffer)
+ {
+ string sentence;
+ do
+ {
+ //double check for valid sentence
+ // Find start of next sentence
+ int start = buffer.IndexOf("$", StringComparison.Ordinal);
+ if (start == -1) return null;
+ buffer = buffer.Substring(start);
+
+ // Find end of sentence
+ int end = buffer.IndexOf("\r", StringComparison.Ordinal);
+ if (end == -1) return null;
+
+ //the NMEA sentence to be parsed
+ sentence = buffer.Substring(0, end + 1);
+
+ //remove the processed sentence from the rawBuffer
+ buffer = buffer.Substring(end + 1);
+ }
+
+ //if sentence has valid checksum, its all good
+ while (!ValidateChecksum(sentence));
+
+ // Remove trailing checksum and \r\n and return
+ sentence = sentence.Substring(0, sentence.IndexOf("*", StringComparison.Ordinal));
+
+ return sentence;
+ }
+
+ public void ParseNMEA(ref string buffer)
+ {
+ if (rawBuffer == null) return;
+
+ //find end of a sentence
+ int cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal);
+ if (cr == -1) return; // No end found, wait for more data
+
+ // Find start of next sentence
+ int dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal);
+ if (dollar == -1) return;
+
+ //if the $ isn't first, get rid of the tail of corrupt sentence
+ if (dollar >= cr) rawBuffer = rawBuffer.Substring(dollar);
+
+ cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal);
+ if (cr == -1) return; // No end found, wait for more data
+ dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal);
+ if (dollar == -1) return;
+
+ //if the $ isn't first, get rid of the tail of corrupt sentence
+ if (dollar >= cr) rawBuffer = rawBuffer.Substring(dollar);
+
+ cr = rawBuffer.IndexOf("\r", StringComparison.Ordinal);
+ dollar = rawBuffer.IndexOf("$", StringComparison.Ordinal);
+ if (cr == -1 || dollar == -1) return;
+
+ if (rawBuffer.Length > 301)
+ {
+ if (isLogNMEA)
+ {
+ logNMEASentence.Append("\r\n" +
+ DateTime.UtcNow.ToString(" ->> mm:ss.fff ", CultureInfo.InvariantCulture) + "\r\n" + rawBuffer + "\r\n");
+ }
+
+ rawBuffer = "";
+ return;
+ }
+
+ if (isLogMonitorOn)
+ {
+ logMonitorSentence.Append(DateTime.UtcNow.ToString("mm:ss.fff ", CultureInfo.InvariantCulture)+rawBuffer);
+ }
+
+
+ //now we have a complete sentence or more somewhere in the portData
+ while (true)
+ {
+ //extract the next NMEA single sentence
+ nextNMEASentence = Parse(ref buffer);
+ if (nextNMEASentence == null) break;
+
+ words = nextNMEASentence.Split(',');
+
+ //parse them accordingly
+ if (words.Length < 3) break;
+
+ if (words[0] == "$PANDA" && words.Length > 14)
+ {
+ ParsePANDA();
+ if (isGPSSentencesOn) pandaSentence = nextNMEASentence;
+ }
+
+ else if (words[0] == "$PAOGI" && words.Length > 14)
+ {
+ ParseOGI();
+ if (isGPSSentencesOn) paogiSentence = nextNMEASentence;
+ }
+
+ else if ((words[0] == "$GPGGA" || words[0] == "$GNGGA") && words.Length > 13)
+ {
+ ParseGGA();
+ if (isGPSSentencesOn) ggaSentence = nextNMEASentence;
+ }
+
+ else if ((words[0] == "$GPVTG" || words[0] == "$GNVTG") && words.Length > 7)
+ {
+ ParseVTG();
+ if (isGPSSentencesOn) vtgSentence = nextNMEASentence;
+ }
+
+ //else if (words[0] == "$GPRMC" || words[0] == "$GNRMC")
+ //{
+ // ParseRMC();
+ // if (isGPSSentencesOn) rmcSentence = nextNMEASentence;
+ //}
+
+ else if (words[0] == "$KSXT")
+ {
+ ParseKSXT();
+ if (isGPSSentencesOn) ksxtSentence = nextNMEASentence;
+ }
+
+ else if (words[0] == "$GPHPD")
+ {
+ ParseHPD();
+ if (isGPSSentencesOn) hpdSentence = nextNMEASentence;
+ }
+
+ else if (words[0] == "$GPHDT" || words[0] == "$GNHDT")
+ {
+ ParseHDT();
+ if (isGPSSentencesOn) hdtSentence = nextNMEASentence;
+ }
+
+ else if (words[0] == "$PTNL" && words.Length > 8)
+ {
+ ParseAVR();
+ if (isGPSSentencesOn) avrSentence = nextNMEASentence;
+ }
+
+ else if (words[0] == "$GNTRA")
+ {
+ ParseTRA();
+ }
+
+ else if (words[0] == "$PSTI" && words[1] == "032")
+ {
+ ParseSTI032(); //there is also an $PSTI,030,... wich contains different data!
+ }
+
+ if (isLogNMEA)
+ {
+ string timNow = DateTime.UtcNow.ToString("HHmmss.fff ", CultureInfo.InvariantCulture);
+ logNMEASentence.Append(timNow + " " + nextNMEASentence + "\r\n");
+
+ //double timD = Convert.ToDouble(timNow);
+ //double timS = Convert.ToDouble(words[1]);
+
+ //logNMEASentence.Append((timD-timS).ToString("N3", CultureInfo.InvariantCulture) + " ")
+ // .Append(timNow + " " + nextNMEASentence + "\r\n");
+
+ }
+
+ }// while still data
+
+ if (isNMEAToSend)
+ {
+ isNMEAToSend = false;
+
+ byte[] nmeaPGN = new byte[57];
+
+ nmeaPGN[0] = 0x80;
+ nmeaPGN[1] = 0x81;
+ nmeaPGN[2] = 0x7C;
+ nmeaPGN[3] = 0xD6;
+ nmeaPGN[4] = 0x33; // nmea total array count minus 6
+
+ //longitude
+ Buffer.BlockCopy(BitConverter.GetBytes(longitudeSend), 0, nmeaPGN, 5, 8);
+ longitudeSend = double.MaxValue;
+
+ //latitude
+ Buffer.BlockCopy(BitConverter.GetBytes(latitudeSend), 0, nmeaPGN, 13, 8);
+ latitudeSend = double.MaxValue;
+
+ //the different dual antenna headings
+ Buffer.BlockCopy(BitConverter.GetBytes(headingTrueDual), 0, nmeaPGN, 21, 4);
+ headingTrueDual = float.MaxValue;
+
+ //single antenna heading in degrees
+ Buffer.BlockCopy(BitConverter.GetBytes(headingTrue), 0, nmeaPGN, 25, 4);
+ headingTrue = float.MaxValue;
+
+ //speed converted to kmh from knots
+ Buffer.BlockCopy(BitConverter.GetBytes(speed), 0, nmeaPGN, 29, 4);
+ speed = float.MaxValue;
+
+ //roll value in degrees
+ Buffer.BlockCopy(BitConverter.GetBytes(roll), 0, nmeaPGN, 33, 4);
+ this.roll = float.MaxValue;
+
+ //altitude in meters
+ Buffer.BlockCopy(BitConverter.GetBytes(altitude), 0, nmeaPGN, 37, 4);
+ this.altitude = float.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(satellitesTracked), 0, nmeaPGN, 41, 2);
+ satellitesTracked = ushort.MaxValue;
+
+ nmeaPGN[43] = (byte)fixQuality;
+ fixQuality = byte.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(hdopX100), 0, nmeaPGN, 44, 2);
+ hdopX100 = ushort.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(ageX100), 0, nmeaPGN, 46, 2);
+ ageX100 = ushort.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(imuHeading), 0, nmeaPGN, 48, 2);
+ imuHeading = ushort.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(imuRoll), 0, nmeaPGN, 50, 2);
+ imuRoll = short.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(imuPitch), 0, nmeaPGN, 52, 2);
+ imuPitch = short.MaxValue;
+
+ Buffer.BlockCopy(BitConverter.GetBytes(imuYawRate), 0, nmeaPGN, 54, 2);
+ imuYawRate = short.MaxValue;
+
+
+ int CK_A = 0;
+ for (int j = 2; j < nmeaPGN.Length; j++)
+ {
+ CK_A += nmeaPGN[j];
+ }
+
+ //checksum
+ nmeaPGN[56] = (byte)CK_A;
+
+ //Send nmea to AgOpenGPS
+ SendToLoopBackMessageAOG(nmeaPGN);
+
+ //Send nmea to autosteer module 8888
+ if (isSendNMEAToUDP) SendUDPMessage(nmeaPGN, epModule);
+ }
+ }
+
+ private void ParseKSXT()
+ {
+ if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3])
+ && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5]))
+ {
+ double.TryParse(words[2], NumberStyles.Float, CultureInfo.InvariantCulture, out longitude);
+ longitudeSend = longitude;
+
+ double.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out latitude);
+ latitudeSend = latitude;
+
+ float.TryParse(words[4], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude);
+ altitudeData = altitude;
+
+ float.TryParse(words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+
+ float.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK);
+
+ float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out speed);
+ speedData = speed;
+
+ byte.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality);
+ if (fixQuality == 0) fixQualityData = 0;
+ else if (fixQuality == 1) fixQualityData = 1;
+ else if (fixQuality == 2) fixQualityData = 5;
+ else if (fixQuality == 3) fixQualityData = 4;
+
+ fixQuality = fixQualityData;
+
+ int headingQuality;
+
+ int.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out headingQuality);
+
+ if (headingQuality == 3) // roll only when rtk
+ {
+ roll = (float)(rollK);
+ rollData = rollK;
+ }
+ else
+ {
+ roll = float.MinValue;
+ rollData = 0;
+ }
+
+ ushort.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked);
+ satellitesData = satellitesTracked;
+
+
+ float.TryParse(words[20], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData);
+ ageX100 = (ushort)(ageData * 100.0);
+
+ isNMEAToSend = true;
+ }
+ }
+
+ private void ParseGGA()
+ {
+ #region GGA Message
+ //$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M , ,*47
+
+ //GGA Global Positioning System Fix Data
+ //123519 Fix taken at 12:35:19 UTC
+ //4807.038,N Latitude 48 deg 07.038' N
+ //01131.000,E Longitude 11 deg 31.000' E
+ //1 Fix quality: 0 = invalid
+ // 1 = GPS fix (SPS)
+ // 2 = DGPS fix
+ // 3 = PPS fix
+ // 4 = Real Time Kinematic
+ // 5 = Float RTK
+ // 6 = estimated (dead reckoning) (2.3 feature)
+ // 7 = Manual input mode
+ // 8 = Simulation mode
+ //08 Number of satellites being tracked
+ //0.9 Horizontal dilution of position
+ //545.4,M Altitude, Meters, above mean sea level
+ //46.9,M Height of geoid (mean sea level) above WGS84 ellipsoid
+ //(empty field) time in seconds since last DGPS update
+ //(empty field) DGPS station ID number
+ //*47 the checksum data, always begins with *
+ #endregion GGA Message
+
+ if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3])
+ && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5]))
+ {
+ //double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC);
+ //if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045)
+ //{
+
+ //FixQuality
+ byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality);
+ fixQualityData = fixQuality;
+
+ //satellites tracked
+ ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked);
+ satellitesData = satellitesTracked;
+
+ //hdop
+ float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData);
+ hdopX100 = (ushort)(hdopData * 100.0);
+
+ //altitude
+ float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude);
+ altitudeData = altitude;
+
+ //age
+ float.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData);
+ ageX100 = (ushort)(ageData*100.0);
+
+ //LastUpdateUTC = UTC;
+
+ //get latitude and convert to decimal degrees
+ int decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[2] += ".00";
+ decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude);
+ double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp);
+ temp *= 0.01666666666667;
+ latitude += temp;
+ if (words[3] == "S")
+ latitude *= -1;
+ latitudeSend = latitude;
+
+ //get longitude and convert to decimal degrees
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[4] += ".00";
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude);
+ double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp);
+ longitude += temp * 0.0166666666667;
+
+ { if (words[5] == "W") longitude *= -1; }
+ longitudeSend = longitude;
+
+ isNMEAToSend = true;
+ }
+ }
+
+ private void ParseVTG()
+ {
+ #region VTG Message
+ //$GPVTG,054.7,T,034.4,M,005.5,N,010.2,K*48
+
+ //VTG Track made good and ground speed
+ //054.7,T True track made good (degrees)
+ //034.4,M Magnetic track made good
+ //005.5,N Ground speed, knots
+ //010.2,K Ground speed, Kilometers per hour
+ //*48 Checksum
+ #endregion VTG Message
+
+
+ if (!string.IsNullOrEmpty(words[7]))
+ {
+ //kph for speed
+ float.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out speed);
+ speedData = speed;
+ }
+ else
+ {
+ speed = speedData = 0;
+ }
+
+ if (!string.IsNullOrEmpty(words[1]))
+ {
+ //True heading
+ float.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrue);
+ headingTrueData = headingTrue;
+ }
+ }
+
+ private void ParseAVR()
+ {
+ #region AVR Message
+ // $PTNL,AVR,145331.50,+35.9990,Yaw,-7.8209,Tilt,-0.4305,Roll,444.232,3,1.2,17 * 03
+
+ //0 Message ID $PTNL,AVR
+ //1 UTC of vector fix
+ //2 Yaw angle, in degrees
+ //3 Yaw
+ //4 Tilt angle, in degrees
+ //5 Tilt
+ //6 Roll angle, in degrees
+ //7 Roll
+ //8 Range, in meters
+ //9 GPS quality indicator:
+ // 0: Fix not available or invalid
+ // 1: Autonomous GPS fix
+ // 2: Differential carrier phase solution RTK(Float)
+ // 3: Differential carrier phase solution RTK(Fix)
+ // 4: Differential code-based solution, DGPS
+ //10 PDOP
+ //11 Number of satellites used in solution
+ //12 The checksum data, always begins with *
+ #endregion AVR Message
+
+ if (!string.IsNullOrEmpty(words[1]))
+ {
+ float.TryParse(words[8] == "Roll" ? words[7] : words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK);
+
+ //Kalman filter
+ Pc = P + varProcess;
+ G = Pc / (Pc + varRoll);
+ P = (1 - G) * Pc;
+ Xp = XeRoll;
+ Zp = Xp;
+ XeRoll = (G * (rollK - Zp)) + Xp;
+ rollData = XeRoll;
+
+ roll = (float)(XeRoll);
+ }
+ }
+
+ private void ParseHPD()
+ {
+ if (!string.IsNullOrEmpty(words[1]))
+ {
+ //Dual heading
+ float.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+
+ float.TryParse(words[4], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK);
+
+ double.TryParse(words[18], NumberStyles.Float, CultureInfo.InvariantCulture, out double baseline);
+
+ //int.TryParse(words[21], NumberStyles.Float, CultureInfo.InvariantCulture, out int solheading);
+
+ if (baseline > 0) // roll only when rtk and baseline
+ {
+ roll = (float)(rollK);
+ rollData = rollK;
+ }
+ else
+ {
+ roll = float.MinValue;
+ rollData = 0;
+ }
+ }
+ }
+
+ private void ParseOGI()
+ {
+ #region PAOGI Message
+ /*
+ $PAOGI
+ (1) 123519 Fix taken at 1219 UTC
+
+ Roll corrected position
+ (2,3) 4807.038,N Latitude 48 deg 07.038' N
+ (4,5) 01131.000,E Longitude 11 deg 31.000' E
+
+ (6) 1 Fix quality:
+ 0 = invalid
+ 1 = GPS fix(SPS)
+ 2 = DGPS fix
+ 3 = PPS fix
+ 4 = Real Time Kinematic
+ 5 = Float RTK
+ 6 = estimated(dead reckoning)(2.3 feature)
+ 7 = Manual input mode
+ 8 = Simulation mode
+ (7) Number of satellites being tracked
+ (8) 0.9 Horizontal dilution of position
+ (9) 545.4 Altitude (ALWAYS in Meters, above mean sea level)
+ (10) 1.2 time in seconds since last DGPS update
+
+ (11) 022.4 Speed over the ground in knots - can be positive or negative
+
+ FROM AHRS:
+ (12) Heading in degrees
+ (13) Roll angle in degrees(positive roll = right leaning - right down, left up)
+ (14) Pitch angle in degrees(Positive pitch = nose up)
+ (15) Yaw Rate in Degrees / second
+
+ * CHKSUM
+ */
+ #endregion PAOGI Message
+
+ if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3])
+ && !string.IsNullOrEmpty(words[4]) && !string.IsNullOrEmpty(words[5]))
+ {
+ //double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC);
+ //if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045)
+ //{
+
+ //FixQuality
+ byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality);
+ fixQualityData = fixQuality;
+
+ //satellites tracked
+ ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked);
+ satellitesData = satellitesTracked;
+
+ //hdop
+ float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData);
+ hdopX100 = (ushort)(hdopData * 100.0);
+
+ //altitude
+ float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude);
+ altitudeData = altitude;
+
+ //kph for speed - knots read
+ float.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out speed);
+ speed *= 1.852f;
+ speedData = speed;
+
+ //Dual antenna derived heading
+ float.TryParse(words[12], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+
+ //roll
+ float.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out roll);
+ rollData = roll;
+
+ //get latitude and convert to decimal degrees
+ int decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[2] += ".00";
+ decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ //age
+ float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData);
+ ageX100 = (ushort)(ageData * 100.0);
+
+ decim -= 2;
+ double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude);
+ double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp);
+ temp *= 0.01666666666666666666666666666667;
+ latitude += temp;
+ if (words[3] == "S")
+ latitude *= -1;
+
+ latitudeSend = latitude;
+
+ //get longitude and convert to decimal degrees
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[4] += ".00";
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude);
+ double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp);
+ longitude += temp * 0.01666666666666666666666666666667;
+
+ { if (words[5] == "W") longitude *= -1; }
+ longitudeSend = longitude;
+
+ //always send because its probably the only one.
+ isNMEAToSend = true;
+ }
+ }
+
+ private void ParsePANDA()
+ {
+ #region PANDA Message
+ /*
+ $PANDA
+ (1) Time of fix
+
+ position
+ (2,3) 4807.038,N Latitude 48 deg 07.038' N
+ (4,5) 01131.000,E Longitude 11 deg 31.000' E
+
+ (6) 1 Fix quality:
+ 0 = invalid
+ 1 = GPS fix(SPS)
+ 2 = DGPS fix
+ 3 = PPS fix
+ 4 = Real Time Kinematic
+ 5 = Float RTK
+ 6 = estimated(dead reckoning)(2.3 feature)
+ 7 = Manual input mode
+ 8 = Simulation mode
+ (7) Number of satellites being tracked
+ (8) 0.9 Horizontal dilution of position
+ (9) 545.4 Altitude (ALWAYS in Meters, above mean sea level)
+ (10) 1.2 time in seconds since last DGPS update
+ (11) Speed in knots
+
+ FROM IMU:
+ (12) Heading in degrees
+ (13) Roll angle in degrees(positive roll = right leaning - right down, left up)
+
+ (14) Pitch angle in degrees(Positive pitch = nose up)
+ (15) Yaw Rate in Degrees / second
+
+ * CHKSUM
+ */
+ #endregion PANDA Message
+
+ if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[2]) && !string.IsNullOrEmpty(words[3])
+ && !string.IsNullOrEmpty(words[3]) && !string.IsNullOrEmpty(words[0]))
+ {
+
+ //get latitude and convert to decimal degrees
+ int decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[2] += ".00";
+ decim = words[2].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[2].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude);
+ double.TryParse(words[2].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp);
+ temp *= 0.01666666666666666666666666666667;
+ latitude += temp;
+ if (words[3] == "S")
+ latitude *= -1;
+
+ latitudeSend = latitude;
+
+ //get longitude and convert to decimal degrees
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[4] += ".00";
+ decim = words[4].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[4].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude);
+ double.TryParse(words[4].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp);
+ longitude += temp * 0.01666666666666666666666666666667;
+
+ { if (words[5] == "W") longitude *= -1; }
+ longitudeSend = longitude;
+
+ //FixQuality
+ byte.TryParse(words[6], NumberStyles.Float, CultureInfo.InvariantCulture, out fixQuality);
+ fixQualityData = fixQuality;
+
+ //satellites tracked
+ ushort.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out satellitesTracked);
+ satellitesData = satellitesTracked;
+
+ //hdop
+ float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out hdopData);
+ hdopX100 = (ushort)(hdopData * 100.0);
+
+ //altitude
+ float.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out altitude);
+ altitudeData = altitude;
+
+ //age
+ float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out ageData);
+ ageX100 = (ushort)(ageData * 100.0);
+
+ //kph for speed - knots read
+ float.TryParse(words[11], NumberStyles.Float, CultureInfo.InvariantCulture, out speed);
+ speed *= 1.852f;
+ speedData = speed;
+
+ //imu heading
+ ushort.TryParse(words[12], NumberStyles.Float, CultureInfo.InvariantCulture, out imuHeading);
+ imuHeadingData = imuHeading;
+
+ //roll
+ short.TryParse(words[13], NumberStyles.Float, CultureInfo.InvariantCulture, out imuRoll);
+ imuRollData = imuRoll;
+
+ //Pitch
+ short.TryParse(words[14], NumberStyles.Float, CultureInfo.InvariantCulture, out imuPitch);
+ imuPitchData = imuPitch;
+
+ //YawRate
+ short.TryParse(words[15], NumberStyles.Float, CultureInfo.InvariantCulture, out imuYawRate);
+ imuYawRateData = imuYawRate;
+
+ //always send because its probably the only one.
+ isNMEAToSend = true;
+ //}
+ }
+ }
+
+ private void ParseHDT()
+ {
+ #region HDT Message
+ //$GNHDT,123.456,T * 00
+
+ //(0) Message ID $GNHDT
+ //(1) Heading in degrees
+ //(2) T: Indicates heading relative to True North
+ //(3) The checksum data, always begins with *
+ #endregion HDT Message
+
+ if (!string.IsNullOrEmpty(words[1]))
+ {
+ //True heading
+ float.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+ }
+ }
+
+ private void ParseSTI032() //heading and roll from SkyTraQ receiver
+ {
+ #region STI0 Message
+ //$PSTI,032,033010.000,111219,A,R,‐4.968,‐10.817,‐1.849,12.046,204.67,,,,,*39
+
+ //(1) 032 Baseline Data indicator
+ //(2) UTC time hhmmss.sss
+ //(3) UTC date ddmmyy
+ //(4) Status:
+ // V = Void
+ // A = Active
+ //(5) Mode Indicator:
+ // F = Float RTK
+ // R = fixed RTK
+ //(6) East-projection of baseline, meters
+ //(7) North-projection of baseline, meters
+ //(8) Up-projection of baseline, meters
+ //(9) Baseline length, meters
+ //(10) Baseline course: angle between baseline vector and north direction, degrees
+ //(11) - (15) Reserved
+ //(16) * Checksum
+ #endregion STI0 Message
+
+ if (!string.IsNullOrEmpty(words[10]))
+ {
+ //baselineCourse: angle between baseline vector (from kinematic base to rover) and north direction, degrees
+ float.TryParse(words[10], NumberStyles.Float, CultureInfo.InvariantCulture, out float baselineCourse);
+ headingTrueDual = ((baselineCourse < 270.0f) ? (baselineCourse + 90.0f) : (baselineCourse - 270.0f)); //Rover Antenna on the left, kinematic base on the right!!!
+ }
+
+ if (!string.IsNullOrEmpty(words[8]) && !string.IsNullOrEmpty(words[9]))
+ {
+ double.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double upProjection); //difference in hight of both antennas (rover - kinematic base)
+ double.TryParse(words[9], NumberStyles.Float, CultureInfo.InvariantCulture, out double baselineLength); //distance between kinematic base and rover
+ rollK = (float)glm.toDegrees(Math.Atan(upProjection / baselineLength)); //roll to the right is positiv (rover left, kinematic base right!)
+
+ //Kalman filter
+ Pc = P + varProcess;
+ G = Pc / (Pc + varRoll);
+ P = (1 - G) * Pc;
+ Xp = XeRoll;
+ Zp = Xp;
+ XeRoll = (G * (rollK - Zp)) + Xp;
+ rollData = XeRoll;
+
+ roll = (float)(XeRoll);
+ }
+ }
+
+ private void ParseTRA() //tra contains hdt and roll for the ub482 receiver
+ {
+ if (!string.IsNullOrEmpty(words[1]))
+ {
+ float.TryParse(words[2], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+
+ // Console.WriteLine(HeadingForced);
+ float.TryParse(words[3], NumberStyles.Float, CultureInfo.InvariantCulture, out rollK);
+ // Console.WriteLine(nRoll);
+
+ int.TryParse(words[5], NumberStyles.Float, CultureInfo.InvariantCulture, out int trasolution);
+ if (trasolution != 4) rollK = 0;
+ rollData = rollK;
+ roll = (float)(rollK);
+ }
+ }
+
+ private void ParseRMC()
+ {
+ #region RMC Message
+ //$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
+
+ //RMC Recommended Minimum sentence C
+ //123519 Fix taken at 12:35:19 UTC
+ //A Status A=active or V=Void.
+ //4807.038,N Latitude 48 deg 07.038' N
+ //01131.000,E Longitude 11 deg 31.000' E
+ //022.4 Speed over the ground in knots
+ //084.4 Track angle in degrees True
+ //230394 Date - 23rd of March 1994
+ //003.1,W Magnetic Variation
+ //*6A * Checksum
+ #endregion RMC Message
+
+ if (!string.IsNullOrEmpty(words[1]) && !string.IsNullOrEmpty(words[3]) && !string.IsNullOrEmpty(words[4])
+ && !string.IsNullOrEmpty(words[5]) && !string.IsNullOrEmpty(words[6]))
+ {
+ //Convert from knots to kph for speed
+ float.TryParse(words[7], NumberStyles.Float, CultureInfo.InvariantCulture, out speed);
+ speed *= 1.852f;
+ speedData = speed;
+
+ //True heading
+ float.TryParse(words[8], NumberStyles.Float, CultureInfo.InvariantCulture, out headingTrueDual);
+ headingTrueDualData = headingTrueDual;
+
+ double.TryParse(words[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double UTC);
+ if ((UTC < LastUpdateUTC ? 240000 + UTC : UTC) - LastUpdateUTC > 0.045)
+ {
+ LastUpdateUTC = UTC;
+
+ //get latitude and convert to decimal degrees
+ int decim = words[3].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[3] += ".00";
+ decim = words[3].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[3].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out latitude);
+ double.TryParse(words[3].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out double temp);
+ latitude += temp * 0.01666666666666666666666666666667;
+
+ if (words[4] == "S")
+ latitude *= -1;
+ latitudeSend = latitude;
+
+ //get longitude and convert to decimal degrees
+ decim = words[5].IndexOf(".", StringComparison.Ordinal);
+ if (decim == -1)
+ {
+ words[5] += ".00";
+ decim = words[5].IndexOf(".", StringComparison.Ordinal);
+ }
+
+ decim -= 2;
+ double.TryParse(words[5].Substring(0, decim), NumberStyles.Float, CultureInfo.InvariantCulture, out longitude);
+ double.TryParse(words[5].Substring(decim), NumberStyles.Float, CultureInfo.InvariantCulture, out temp);
+ longitude += temp * 0.01666666666666666666666666666667;
+
+ if (words[6] == "W") longitude *= -1;
+ longitudeSend = longitude;
+
+ isNMEAToSend = true;
+ }
+ }
+ }
+
+ public bool ValidateChecksum(string Sentence)
+ {
+ int sum = 0;
+ try
+ {
+ char[] sentenceChars = Sentence.ToCharArray();
+ // All character xor:ed results in the trailing hex checksum
+ // The checksum calc starts after '$' and ends before '*'
+
+ int inx = Sentence.IndexOf("*", StringComparison.Ordinal);
+
+ if (sentenceChars.Length - inx == 4)
+ {
+
+ for (inx = 1; ; inx++)
+ {
+ if (inx >= sentenceChars.Length) // No checksum found
+ return false;
+ var tmp = sentenceChars[inx];
+ // Indicates end of data and start of checksum
+ if (tmp == '*') break;
+ sum ^= tmp; // Build checksum
+ }
+
+ // Calculated checksum converted to a 2 digit hex string
+ string sumStr = string.Format("{0:X2}", sum);
+
+ // Compare to checksum in sentence
+ return sumStr.Equals(Sentence.Substring(inx + 1, 2));
+ }
+ else
+ {
+ //CRC code goes here - return true for now if $KS
+ if(sentenceChars[0] == 36 && sentenceChars[1] == 75 && sentenceChars[2] == 83) return true;
+ else return false;
+ }
+ }
+ catch (Exception)
+ {
+ //mf.WriteErrorLog("Validate Checksum" + e);
+ return false;
+ }
+ }
+ }
+}
diff --git a/Source/Forms/UDP.designer.cs b/Source/Forms/UDP.designer.cs
new file mode 100644
index 0000000..057a49a
--- /dev/null
+++ b/Source/Forms/UDP.designer.cs
@@ -0,0 +1,312 @@
+using System;
+using System.Drawing;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace AgTwo
+{
+ public partial class FormLoop
+ {
+ // UDP Sockets
+ public Socket UDPSocket;
+ private EndPoint endPointUDP = new IPEndPoint(IPAddress.Any, 0);
+
+ public bool isUDPNetworkConnected;
+
+ //UDP Endpoints
+ public IPEndPoint epAgIO = new IPEndPoint(IPAddress.Parse(
+ Properties.Settings.Default.etIP_SubnetOne.ToString() + "." +
+ Properties.Settings.Default.etIP_SubnetTwo.ToString() + "." +
+ Properties.Settings.Default.etIP_SubnetThree.ToString() + ".255"), 9999);
+
+ // Data stream
+ private byte[] buffer = new byte[1024];
+
+ //used to send communication check pgn= C8 or 200
+ private byte[] helloFromAgIO = { 0x80, 0x81, 0x7F, 200, 3, 56, 0, 0, 0x47 };
+
+ public IPAddress ipCurrent;
+
+ //initialize udp network
+ public void LoadUDPNetwork()
+ {
+ helloFromAgIO[5] = 56;
+
+ lblIP.Text = "";
+ try //udp network
+ {
+ string bob = Dns.GetHostName();
+ foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
+ {
+ if (IPA.AddressFamily == AddressFamily.InterNetwork)
+ {
+ string data = IPA.ToString();
+ lblIP.Text += IPA.ToString().Trim() + "\r\n";
+ }
+ }
+
+ // Initialise the socket
+ UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+ UDPSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
+ UDPSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
+ UDPSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPointUDP,
+ new AsyncCallback(ReceiveDataUDPAsync), null);
+
+ isUDPNetworkConnected = true;
+
+ //if (!isFound)
+ //{
+ // MessageBox.Show("Network Address of Modules -> " + Properties.Settings.Default.setIP_localAOG+"[2 - 254] May not exist. \r\n"
+ // + "Are you sure ethernet is connected?\r\n" + "Go to UDP Settings to fix.\r\n\r\n", "Network Connection Error",
+ // MessageBoxButtons.OK, MessageBoxIcon.Error);
+ // //btnUDP.BackColor = Color.Red;
+ // lblIP.Text = "Not Connected";
+ //}
+ }
+ catch (Exception e)
+ {
+ //WriteErrorLog("UDP Server" + e);
+ MessageBox.Show(e.Message, "Serious Network Connection Error",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ lblIP.Text = "Error";
+ }
+ }
+
+ #region Send UDP
+
+ public void SendUDPMessage(byte[] byteData)
+ {
+ if (isUDPNetworkConnected)
+ {
+ try
+ {
+ // Send packet to the zero
+ if (byteData.Length != 0)
+ {
+ UDPSocket.BeginSendTo(byteData, 0, byteData.Length, SocketFlags.None,
+ epAgIO, new AsyncCallback(SendDataUDPAsync), null);
+ }
+ }
+ catch (Exception)
+ {
+ //WriteErrorLog("Sending UDP Message" + e.ToString());
+ //MessageBox.Show("Send Error: " + e.Message, "UDP Client", MessageBoxButtons.OK,
+ //MessageBoxIcon.Error);
+ }
+ }
+ }
+
+ public void SendUDPMessage(string message)
+ {
+ if (isUDPNetworkConnected)
+ {
+ try
+ {
+ // Get packet as byte array to send
+ byte[] byteData = Encoding.ASCII.GetBytes(message);
+ if (byteData.Length != 0)
+ UDPSocket.BeginSendTo(byteData, 0, byteData.Length, SocketFlags.None,
+ epAgIO, new AsyncCallback(SendDataUDPAsync), null);
+ }
+ catch (Exception)
+ {
+ }
+ }
+ }
+
+
+ private void SendDataUDPAsync(IAsyncResult asyncResult)
+ {
+ try
+ {
+ UDPSocket.EndSend(asyncResult);
+ }
+ catch (Exception)
+ {
+ //WriteErrorLog(" UDP Send Data" + e.ToString());
+ //MessageBox.Show("SendData Error: " + e.Message, "UDP Server", MessageBoxButtons.OK,
+ //MessageBoxIcon.Error);
+ }
+ }
+
+ #endregion
+
+ #region Receive UDP
+
+ private void ReceiveDataUDPAsync(IAsyncResult asyncResult)
+ {
+ try
+ {
+ // Receive all data
+ int msgLen = UDPSocket.EndReceiveFrom(asyncResult, ref endPointUDP);
+
+ byte[] localMsg = new byte[msgLen];
+ Array.Copy(buffer, localMsg, msgLen);
+
+ // Listen for more connections again...
+ UDPSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPointUDP,
+ new AsyncCallback(ReceiveDataUDPAsync), null);
+
+ BeginInvoke((MethodInvoker)(() => ReceiveFromUDP(localMsg)));
+
+ }
+ catch (Exception)
+ {
+ //WriteErrorLog("UDP Recv data " + e.ToString());
+ //MessageBox.Show("ReceiveData Error: " + e.Message, "UDP Server", MessageBoxButtons.OK,
+ //MessageBoxIcon.Error);
+ }
+ }
+
+
+ static byte [] PGN_253 = { 128, 129, 126, 253, 8, 0, 0, 0, 0, 0, 0, 0, 0, 12 };
+ int PGN_253_Size = PGN_253.Length - 1;
+
+ //Heart beat hello AgIO
+ static byte [] helloFromAutoSteer = { 128, 129, 126, 126, 5, 0, 0, 0, 0, 0, 71 };
+ short helloSteerPosition = 0;
+
+
+ //Relays
+ bool isRelayActiveHigh = true;
+ byte relay = 0, relayHi = 0, uTurn = 0;
+ byte xte = 0;
+
+ //Switches
+ int remoteSwitch = 0, workSwitch = 0, steerSwitch = 1, switchByte = 0;
+
+ //On Off
+ byte guidanceStatus = 0;
+ byte prevGuidanceStatus = 0;
+ bool guidanceStatusChanged = false;
+
+ //speed sent as *10
+ double gpsSpeed = 0;
+
+ //steering variables
+ double steerAngleActual = 8.8;
+ double steerAngleSetPoint = 0; //the desired angle from AgOpen
+ int steeringPosition = 0; //from steering sensor
+ double steerAngleError = 0; //setpoint - actual
+
+ private void ReceiveFromUDP(byte[] data)
+ {
+ try
+ {
+ //Hello and scan reply
+ if (data[0] == 0x80 && data[1] == 0x81)
+ {
+ switch (data[3])
+ {
+ case 126:
+ {
+ //traffic.helloFromAutoSteer = 0;
+ if (isViewAdvanced)
+ {
+ double actualSteerAngle = (Int16)((data[6] << 8) + data[5]);
+ lblWAS.Text = (actualSteerAngle * 0.01).ToString("N1");
+ lblWASCounts.Text = ((Int16)((data[8] << 8) + data[7])).ToString();
+
+ lblSwitchStatus.Text = ((data[9] & 2) == 2).ToString();
+ lblWorkSwitchStatus.Text = ((data[9] & 1) == 1).ToString();
+ }
+ break;
+ }
+
+ case 254:
+ {
+ gpsSpeed = ((double)(data[5] | data[6] << 8)) * 0.1;
+
+ prevGuidanceStatus = guidanceStatus;
+
+ guidanceStatus = data[7];
+ guidanceStatusChanged = (guidanceStatus != prevGuidanceStatus);
+
+ //Bit 8,9 set point steer angle * 100 is sent
+ steerAngleSetPoint = ((float)(data[8] | data[9] << 8)) * 0.01; //high low bytes
+
+ //Bit 10 Tram
+ xte = data[10];
+
+ //Bit 11
+ relay = data[11];
+
+ //Bit 12
+ relayHi = data[12];
+
+ //----------------------------------------------------------------------------
+ //Serial Send to agopenGPS
+
+ int sa = (int)(steerAngleActual * 100);
+
+ PGN_253[5] = unchecked((byte)((int)(sa)));
+ PGN_253[6] = unchecked((byte)((int)(sa) >> 8));
+
+ //heading
+ PGN_253[7] = unchecked((byte)((int)(9999)));
+ PGN_253[8] = unchecked((byte)((int)(9999) >> 8));
+
+ //roll
+ PGN_253[9] = unchecked((byte)((int)(8888)));
+ PGN_253[10] = unchecked((byte)((int)(8888) >> 8));
+
+ switchByte = 0;
+ switchByte |= ((int)remoteSwitch << 2); //put remote in bit 2
+ switchByte |= (steerSwitch << 1); //put steerswitch status in bit 1 position
+ switchByte |= workSwitch;
+
+ PGN_253[11] = (byte)switchByte;
+ PGN_253[12] = 44; //(uint8_t)pwmDisplay;
+
+ //checksum
+ int CK_A = 0;
+ for (int i = 2; i < PGN_253_Size; i++)
+ CK_A = (CK_A + PGN_253[i]);
+
+ PGN_253[PGN_253_Size] = unchecked((byte)((int)(CK_A)));
+
+ SendUDPMessage(PGN_253);
+
+ break;
+ }
+
+ case 200: // Hello from AgIO
+ {
+ int sa = (int)(steerAngleActual * 100);
+
+ helloFromAutoSteer[5] = unchecked((byte)((int)(sa)));
+ helloFromAutoSteer[6] = unchecked((byte)((int)(sa) >> 8));
+
+ helloFromAutoSteer[7] = 0;
+ helloFromAutoSteer[8] = 0;
+ helloFromAutoSteer[9] = (byte)switchByte;
+
+ SendUDPMessage(helloFromAutoSteer);
+
+ break;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ default:
+ {
+ //module return via udp sent to AOG
+ //SendToLoopBackMessageAOG(data);
+
+ break;
+ }
+ }
+ } // end of pgns
+ }
+ catch
+ {
+
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/GlobalSuppressions.cs b/Source/GlobalSuppressions.cs
new file mode 100644
index 0000000..45cefd4
--- /dev/null
+++ b/Source/GlobalSuppressions.cs
@@ -0,0 +1,15 @@
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project.
+// Project-level suppressions either have no target or are given
+// a specific target and scoped to a namespace, type, member, etc.
+
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormGPSData.timer1_Tick(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnRelayTest_Click(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnResetTimer_Click(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.btnUDP_Click(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.deviceManagerToolStripMenuItem_Click(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.lblIP_Click(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.oneSecondLoopTimer_Tick(System.Object,System.EventArgs)")]
+[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~M:AgTwo.FormLoop.toolStripEthernet_Click(System.Object,System.EventArgs)")]
diff --git a/Source/ModSim.csproj b/Source/ModSim.csproj
new file mode 100644
index 0000000..defbb1b
--- /dev/null
+++ b/Source/ModSim.csproj
@@ -0,0 +1,257 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {38E5D197-82BB-42DE-83F8-9D550D09BCDC}
+ WinExe
+ AgTwo
+ AgTwo
+ v4.8
+ 512
+ true
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ ..\..\..\AgOpenGPS_v5\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ none
+ true
+ ..\..\..\AgOpenGPS_v5\
+ TRACE
+ prompt
+ 4
+
+
+ ModSim_ico.ico
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ FormGPSData.cs
+
+
+ Form
+
+
+ FormLoop.cs
+
+
+ Form
+
+
+ FormPGN.cs
+
+
+ Form
+
+
+ FormYes.cs
+
+
+ Form
+
+
+ FormYesNo.cs
+
+
+ Form
+
+
+ FormTimedMessage.cs
+
+
+
+
+
+ FormGPSData.cs
+ Designer
+
+
+ FormLoop.cs
+
+
+ FormPGN.cs
+
+
+ FormYes.cs
+
+
+ FormYesNo.cs
+
+
+ FormTimedMessage.cs
+
+
+ ResXFileCodeGenerator
+ Designer
+ Resources.Designer.cs
+
+
+ ResXFileCodeGenerator
+ gStr.Designer.cs
+ Designer
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ True
+ gStr.resx
+
+
+ Form
+ FormLoop.cs
+
+
+ Form
+ FormLoop.cs
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ Microsoft .NET Framework 4.6 %28x86 and x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
\ No newline at end of file
diff --git a/Source/ModSim_ico.ico b/Source/ModSim_ico.ico
new file mode 100644
index 0000000..16c67ba
Binary files /dev/null and b/Source/ModSim_ico.ico differ
diff --git a/Source/Program.cs b/Source/Program.cs
new file mode 100644
index 0000000..357633c
--- /dev/null
+++ b/Source/Program.cs
@@ -0,0 +1,49 @@
+using Microsoft.Win32;
+using System;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace AgTwo
+{
+ internal static class Program
+ {
+ private static readonly Mutex Mutex = new Mutex(true, "{8F6F0AC4-B9A1-55fd-A8CF-72F04E6BDE82}");
+
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ private static void Main()
+ {
+ ////opening the subkey
+ RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\AgOpenGPS");
+
+ ////create default keys if not existing
+ if (regKey == null)
+ {
+ RegistryKey Key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\AgOpenGPS");
+
+ //storing the values
+ Key.SetValue("Language", "en");
+ Key.Close();
+
+ Properties.Settings.Default.setF_culture = "en";
+ Properties.Settings.Default.Save();
+ }
+ else
+ {
+ Properties.Settings.Default.setF_culture = regKey.GetValue("Language").ToString();
+ Properties.Settings.Default.Save();
+ regKey.Close();
+ }
+
+ if (Mutex.WaitOne(TimeSpan.Zero, true))
+ {
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new FormLoop());
+ }
+ }
+ }
+}
diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a4c5da0
--- /dev/null
+++ b/Source/Properties/AssemblyInfo.cs
@@ -0,0 +1,37 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("AgTwo")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("AgTwo")]
+[assembly: AssemblyCopyright("Copyright © 2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c88a8244-47f5-4275-aa35-54cc884e9ede")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("5.8.9")]
+[assembly: AssemblyFileVersion("5.8.9")]
+[assembly: NeutralResourcesLanguage("en-CA")]
diff --git a/Source/Properties/Resources.Designer.cs b/Source/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..672c85d
--- /dev/null
+++ b/Source/Properties/Resources.Designer.cs
@@ -0,0 +1,503 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AgTwo.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AgTwo.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap AddNew {
+ get {
+ object obj = ResourceManager.GetObject("AddNew", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap AgIO_First {
+ get {
+ object obj = ResourceManager.GetObject("AgIO_First", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap AgIOBtn {
+ get {
+ object obj = ResourceManager.GetObject("AgIOBtn", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ArrowGrnLeft {
+ get {
+ object obj = ResourceManager.GetObject("ArrowGrnLeft", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ArrowGrnRight {
+ get {
+ object obj = ResourceManager.GetObject("ArrowGrnRight", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ArrowLeft {
+ get {
+ object obj = ResourceManager.GetObject("ArrowLeft", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ArrowRight {
+ get {
+ object obj = ResourceManager.GetObject("ArrowRight", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap B_Autosteer {
+ get {
+ object obj = ResourceManager.GetObject("B_Autosteer", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap B_GPS {
+ get {
+ object obj = ResourceManager.GetObject("B_GPS", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap B_IMU {
+ get {
+ object obj = ResourceManager.GetObject("B_IMU", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap B_Machine {
+ get {
+ object obj = ResourceManager.GetObject("B_Machine", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap B_UDP {
+ get {
+ object obj = ResourceManager.GetObject("B_UDP", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap back_button {
+ get {
+ object obj = ResourceManager.GetObject("back_button", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Cancel64 {
+ get {
+ object obj = ResourceManager.GetObject("Cancel64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ConSt_Mandatory {
+ get {
+ object obj = ResourceManager.GetObject("ConSt_Mandatory", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap DeviceManager {
+ get {
+ object obj = ResourceManager.GetObject("DeviceManager", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap DnArrow64 {
+ get {
+ object obj = ResourceManager.GetObject("DnArrow64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Edit {
+ get {
+ object obj = ResourceManager.GetObject("Edit", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap EthernetSetup {
+ get {
+ object obj = ResourceManager.GetObject("EthernetSetup", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Help {
+ get {
+ object obj = ResourceManager.GetObject("Help", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap LogNMEA {
+ get {
+ object obj = ResourceManager.GetObject("LogNMEA", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Nav {
+ get {
+ object obj = ResourceManager.GetObject("Nav", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Nmea {
+ get {
+ object obj = ResourceManager.GetObject("Nmea", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap NTRIP_Serial {
+ get {
+ object obj = ResourceManager.GetObject("NTRIP_Serial", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap NtripSettings {
+ get {
+ object obj = ResourceManager.GetObject("NtripSettings", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap OK64 {
+ get {
+ object obj = ResourceManager.GetObject("OK64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Pause {
+ get {
+ object obj = ResourceManager.GetObject("Pause", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap PGN {
+ get {
+ object obj = ResourceManager.GetObject("PGN", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Play {
+ get {
+ object obj = ResourceManager.GetObject("Play", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ResetTimer {
+ get {
+ object obj = ResourceManager.GetObject("ResetTimer", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ScanNetwork {
+ get {
+ object obj = ResourceManager.GetObject("ScanNetwork", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap ScanPorts {
+ get {
+ object obj = ResourceManager.GetObject("ScanPorts", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap SerialMonitor {
+ get {
+ object obj = ResourceManager.GetObject("SerialMonitor", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Settings48 {
+ get {
+ object obj = ResourceManager.GetObject("Settings48", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Sort {
+ get {
+ object obj = ResourceManager.GetObject("Sort", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap SubnetSend {
+ get {
+ object obj = ResourceManager.GetObject("SubnetSend", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap SwitchOff {
+ get {
+ object obj = ResourceManager.GetObject("SwitchOff", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap TestRelays {
+ get {
+ object obj = ResourceManager.GetObject("TestRelays", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap Trash {
+ get {
+ object obj = ResourceManager.GetObject("Trash", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap UpArrow64 {
+ get {
+ object obj = ResourceManager.GetObject("UpArrow64", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap VehFileLoad {
+ get {
+ object obj = ResourceManager.GetObject("VehFileLoad", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap VehFileSave {
+ get {
+ object obj = ResourceManager.GetObject("VehFileSave", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap WindowsShutDown {
+ get {
+ object obj = ResourceManager.GetObject("WindowsShutDown", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap www {
+ get {
+ object obj = ResourceManager.GetObject("www", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/Source/Properties/Resources.resx b/Source/Properties/Resources.resx
new file mode 100644
index 0000000..817cced
--- /dev/null
+++ b/Source/Properties/Resources.resx
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\btnImages\www.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\VehFileLoad.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ConSt_Mandatory.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ArrowGrnRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\DeviceManager.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\TestRelays.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ScanNetwork.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\B_Machine.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\NTRIP_Serial.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\VehFileSave.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\B_GPS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnimages\trash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\AgIOBtn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\B_IMU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\AddNew.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Pause.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\back-button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Nmea.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\B_UDP.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Settings48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\DnArrow64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\WindowsShutDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ResetTimer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ArrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\SubnetSend.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Sort.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\EthernetSetup.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ArrowGrnLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\B_Autosteer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\UpArrow64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Cancel64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\LogNMEA.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\AgIO_First.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\PGN.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\SwitchOff.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ScanPorts.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\ArrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\SerialMonitor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\NtripSettings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\OK64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\btnImages\Nav.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Source/Properties/Settings.Designer.cs b/Source/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..e04a837
--- /dev/null
+++ b/Source/Properties/Settings.Designer.cs
@@ -0,0 +1,314 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AgTwo.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool setUDP_isOn {
+ get {
+ return ((bool)(this["setUDP_isOn"]));
+ }
+ set {
+ this["setUDP_isOn"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("29999")]
+ public int setIP_thisPort {
+ get {
+ return ((int)(this["setIP_thisPort"]));
+ }
+ set {
+ this["setIP_thisPort"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("28888")]
+ public int setIP_autoSteerPort {
+ get {
+ return ((int)(this["setIP_autoSteerPort"]));
+ }
+ set {
+ this["setIP_autoSteerPort"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool setPgm_isFirstRun {
+ get {
+ return ((bool)(this["setPgm_isFirstRun"]));
+ }
+ set {
+ this["setPgm_isFirstRun"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double setPgm_defaultLat {
+ get {
+ return ((double)(this["setPgm_defaultLat"]));
+ }
+ set {
+ this["setPgm_defaultLat"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double setPgm_defaultLon {
+ get {
+ return ((double)(this["setPgm_defaultLon"]));
+ }
+ set {
+ this["setPgm_defaultLon"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("en")]
+ public string setF_culture {
+ get {
+ return ((string)(this["setF_culture"]));
+ }
+ set {
+ this["setF_culture"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Default")]
+ public string setF_workingDirectory {
+ get {
+ return ((string)(this["setF_workingDirectory"]));
+ }
+ set {
+ this["setF_workingDirectory"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double setGPS_SimLatitude {
+ get {
+ return ((double)(this["setGPS_SimLatitude"]));
+ }
+ set {
+ this["setGPS_SimLatitude"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public double setGPS_SimLongitude {
+ get {
+ return ((double)(this["setGPS_SimLongitude"]));
+ }
+ set {
+ this["setGPS_SimLongitude"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string setComm_commName {
+ get {
+ return ((string)(this["setComm_commName"]));
+ }
+ set {
+ this["setComm_commName"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool setUDP_isSendNMEAToUDP {
+ get {
+ return ((bool)(this["setUDP_isSendNMEAToUDP"]));
+ }
+ set {
+ this["setUDP_isSendNMEAToUDP"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool setUDP_isUsePluginApp {
+ get {
+ return ((bool)(this["setUDP_isUsePluginApp"]));
+ }
+ set {
+ this["setUDP_isUsePluginApp"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool setMod_isNavConnected {
+ get {
+ return ((bool)(this["setMod_isNavConnected"]));
+ }
+ set {
+ this["setMod_isNavConnected"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool setMod_isMachineConnected {
+ get {
+ return ((bool)(this["setMod_isMachineConnected"]));
+ }
+ set {
+ this["setMod_isMachineConnected"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool setMod_isSteerConnected {
+ get {
+ return ((bool)(this["setMod_isSteerConnected"]));
+ }
+ set {
+ this["setMod_isSteerConnected"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("192")]
+ public byte etIP_SubnetOne {
+ get {
+ return ((byte)(this["etIP_SubnetOne"]));
+ }
+ set {
+ this["etIP_SubnetOne"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("168")]
+ public byte etIP_SubnetTwo {
+ get {
+ return ((byte)(this["etIP_SubnetTwo"]));
+ }
+ set {
+ this["etIP_SubnetTwo"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public byte etIP_SubnetThree {
+ get {
+ return ((byte)(this["etIP_SubnetThree"]));
+ }
+ set {
+ this["etIP_SubnetThree"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("127")]
+ public byte eth_loopOne {
+ get {
+ return ((byte)(this["eth_loopOne"]));
+ }
+ set {
+ this["eth_loopOne"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("255")]
+ public byte eth_loopTwo {
+ get {
+ return ((byte)(this["eth_loopTwo"]));
+ }
+ set {
+ this["eth_loopTwo"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("255")]
+ public byte eth_loopThree {
+ get {
+ return ((byte)(this["eth_loopThree"]));
+ }
+ set {
+ this["eth_loopThree"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("255")]
+ public byte eth_loopFour {
+ get {
+ return ((byte)(this["eth_loopFour"]));
+ }
+ set {
+ this["eth_loopFour"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string Setting {
+ get {
+ return ((string)(this["Setting"]));
+ }
+ set {
+ this["Setting"] = value;
+ }
+ }
+ }
+}
diff --git a/Source/Properties/Settings.settings b/Source/Properties/Settings.settings
new file mode 100644
index 0000000..4041789
--- /dev/null
+++ b/Source/Properties/Settings.settings
@@ -0,0 +1,78 @@
+
+
+
+
+
+ True
+
+
+ 29999
+
+
+ 28888
+
+
+ True
+
+
+ 0
+
+
+ 0
+
+
+ en
+
+
+ Default
+
+
+ 0
+
+
+ 0
+
+
+
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ 192
+
+
+ 168
+
+
+ 1
+
+
+ 127
+
+
+ 255
+
+
+ 255
+
+
+ 255
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Settings.cs b/Source/Settings.cs
new file mode 100644
index 0000000..bb4df3a
--- /dev/null
+++ b/Source/Settings.cs
@@ -0,0 +1,28 @@
+namespace AgIO.Properties {
+
+
+ // This class allows you to handle specific events on the settings class:
+ // The SettingChanging event is raised before a setting's value is changed.
+ // The PropertyChanged event is raised after a setting's value is changed.
+ // The SettingsLoaded event is raised after the setting values are loaded.
+ // The SettingsSaving event is raised before the setting values are saved.
+ internal sealed partial class Settings {
+
+ public Settings() {
+ // // To add event handlers for saving and changing settings, uncomment the lines below:
+ //
+ // this.SettingChanging += this.SettingChangingEventHandler;
+ //
+ // this.SettingsSaving += this.SettingsSavingEventHandler;
+ //
+ }
+
+ private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
+ // Add code to handle the SettingChangingEvent event here.
+ }
+
+ private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
+ // Add code to handle the SettingsSaving event here.
+ }
+ }
+}
diff --git a/Source/btnImages/AddNew.png b/Source/btnImages/AddNew.png
new file mode 100644
index 0000000..ac5d7d0
Binary files /dev/null and b/Source/btnImages/AddNew.png differ
diff --git a/Source/btnImages/AgIOAoG.png b/Source/btnImages/AgIOAoG.png
new file mode 100644
index 0000000..bc41cb5
Binary files /dev/null and b/Source/btnImages/AgIOAoG.png differ
diff --git a/Source/btnImages/AgIOBtn.png b/Source/btnImages/AgIOBtn.png
new file mode 100644
index 0000000..ade651c
Binary files /dev/null and b/Source/btnImages/AgIOBtn.png differ
diff --git a/Source/btnImages/AgIO_First.gif b/Source/btnImages/AgIO_First.gif
new file mode 100644
index 0000000..fbbf338
Binary files /dev/null and b/Source/btnImages/AgIO_First.gif differ
diff --git a/Source/btnImages/ArrowGrnLeft.png b/Source/btnImages/ArrowGrnLeft.png
new file mode 100644
index 0000000..d015f25
Binary files /dev/null and b/Source/btnImages/ArrowGrnLeft.png differ
diff --git a/Source/btnImages/ArrowGrnRight.png b/Source/btnImages/ArrowGrnRight.png
new file mode 100644
index 0000000..d3f3dd2
Binary files /dev/null and b/Source/btnImages/ArrowGrnRight.png differ
diff --git a/Source/btnImages/ArrowLeft.png b/Source/btnImages/ArrowLeft.png
new file mode 100644
index 0000000..8f9fd3b
Binary files /dev/null and b/Source/btnImages/ArrowLeft.png differ
diff --git a/Source/btnImages/ArrowRight.png b/Source/btnImages/ArrowRight.png
new file mode 100644
index 0000000..aa803e9
Binary files /dev/null and b/Source/btnImages/ArrowRight.png differ
diff --git a/Source/btnImages/B_Autosteer.png b/Source/btnImages/B_Autosteer.png
new file mode 100644
index 0000000..0a8af7a
Binary files /dev/null and b/Source/btnImages/B_Autosteer.png differ
diff --git a/Source/btnImages/B_GPS.png b/Source/btnImages/B_GPS.png
new file mode 100644
index 0000000..86340df
Binary files /dev/null and b/Source/btnImages/B_GPS.png differ
diff --git a/Source/btnImages/B_IMU.png b/Source/btnImages/B_IMU.png
new file mode 100644
index 0000000..70d7e06
Binary files /dev/null and b/Source/btnImages/B_IMU.png differ
diff --git a/Source/btnImages/B_Machine.png b/Source/btnImages/B_Machine.png
new file mode 100644
index 0000000..c01f5e2
Binary files /dev/null and b/Source/btnImages/B_Machine.png differ
diff --git a/Source/btnImages/B_UDP.png b/Source/btnImages/B_UDP.png
new file mode 100644
index 0000000..a22c8c4
Binary files /dev/null and b/Source/btnImages/B_UDP.png differ
diff --git a/Source/btnImages/Cancel64.png b/Source/btnImages/Cancel64.png
new file mode 100644
index 0000000..a8092c6
Binary files /dev/null and b/Source/btnImages/Cancel64.png differ
diff --git a/Source/btnImages/ConSt_Mandatory.png b/Source/btnImages/ConSt_Mandatory.png
new file mode 100644
index 0000000..ec8af16
Binary files /dev/null and b/Source/btnImages/ConSt_Mandatory.png differ
diff --git a/Source/btnImages/DeviceManager.png b/Source/btnImages/DeviceManager.png
new file mode 100644
index 0000000..8e0c3bb
Binary files /dev/null and b/Source/btnImages/DeviceManager.png differ
diff --git a/Source/btnImages/DnArrow64.png b/Source/btnImages/DnArrow64.png
new file mode 100644
index 0000000..695618d
Binary files /dev/null and b/Source/btnImages/DnArrow64.png differ
diff --git a/Source/btnImages/Edit.png b/Source/btnImages/Edit.png
new file mode 100644
index 0000000..f8b72bf
Binary files /dev/null and b/Source/btnImages/Edit.png differ
diff --git a/Source/btnImages/EthernetSetup.png b/Source/btnImages/EthernetSetup.png
new file mode 100644
index 0000000..6dc7aae
Binary files /dev/null and b/Source/btnImages/EthernetSetup.png differ
diff --git a/Source/btnImages/Help.png b/Source/btnImages/Help.png
new file mode 100644
index 0000000..901ac04
Binary files /dev/null and b/Source/btnImages/Help.png differ
diff --git a/Source/btnImages/LogNMEA.png b/Source/btnImages/LogNMEA.png
new file mode 100644
index 0000000..fc04fda
Binary files /dev/null and b/Source/btnImages/LogNMEA.png differ
diff --git a/Source/btnImages/NTRIP_Serial.png b/Source/btnImages/NTRIP_Serial.png
new file mode 100644
index 0000000..16b970c
Binary files /dev/null and b/Source/btnImages/NTRIP_Serial.png differ
diff --git a/Source/btnImages/Nav.png b/Source/btnImages/Nav.png
new file mode 100644
index 0000000..e5358bd
Binary files /dev/null and b/Source/btnImages/Nav.png differ
diff --git a/Source/btnImages/Nmea.png b/Source/btnImages/Nmea.png
new file mode 100644
index 0000000..0bb31f7
Binary files /dev/null and b/Source/btnImages/Nmea.png differ
diff --git a/Source/btnImages/NtripSettings.png b/Source/btnImages/NtripSettings.png
new file mode 100644
index 0000000..38929bc
Binary files /dev/null and b/Source/btnImages/NtripSettings.png differ
diff --git a/Source/btnImages/OK64.png b/Source/btnImages/OK64.png
new file mode 100644
index 0000000..68f7f1b
Binary files /dev/null and b/Source/btnImages/OK64.png differ
diff --git a/Source/btnImages/PGN.png b/Source/btnImages/PGN.png
new file mode 100644
index 0000000..7acbaaa
Binary files /dev/null and b/Source/btnImages/PGN.png differ
diff --git a/Source/btnImages/Pause.png b/Source/btnImages/Pause.png
new file mode 100644
index 0000000..dcea989
Binary files /dev/null and b/Source/btnImages/Pause.png differ
diff --git a/Source/btnImages/Play.png b/Source/btnImages/Play.png
new file mode 100644
index 0000000..7b3c8be
Binary files /dev/null and b/Source/btnImages/Play.png differ
diff --git a/Source/btnImages/ResetTimer.png b/Source/btnImages/ResetTimer.png
new file mode 100644
index 0000000..6fa4e2e
Binary files /dev/null and b/Source/btnImages/ResetTimer.png differ
diff --git a/Source/btnImages/ScanNetwork.png b/Source/btnImages/ScanNetwork.png
new file mode 100644
index 0000000..92ee76f
Binary files /dev/null and b/Source/btnImages/ScanNetwork.png differ
diff --git a/Source/btnImages/ScanPorts.png b/Source/btnImages/ScanPorts.png
new file mode 100644
index 0000000..5638d88
Binary files /dev/null and b/Source/btnImages/ScanPorts.png differ
diff --git a/Source/btnImages/SerialMonitor.png b/Source/btnImages/SerialMonitor.png
new file mode 100644
index 0000000..b6d2d65
Binary files /dev/null and b/Source/btnImages/SerialMonitor.png differ
diff --git a/Source/btnImages/Settings48.png b/Source/btnImages/Settings48.png
new file mode 100644
index 0000000..acf6721
Binary files /dev/null and b/Source/btnImages/Settings48.png differ
diff --git a/Source/btnImages/Sort.png b/Source/btnImages/Sort.png
new file mode 100644
index 0000000..690b900
Binary files /dev/null and b/Source/btnImages/Sort.png differ
diff --git a/Source/btnImages/SubnetSend.png b/Source/btnImages/SubnetSend.png
new file mode 100644
index 0000000..eb7a084
Binary files /dev/null and b/Source/btnImages/SubnetSend.png differ
diff --git a/Source/btnImages/SwitchOff.png b/Source/btnImages/SwitchOff.png
new file mode 100644
index 0000000..ac656f6
Binary files /dev/null and b/Source/btnImages/SwitchOff.png differ
diff --git a/Source/btnImages/TestRelays.png b/Source/btnImages/TestRelays.png
new file mode 100644
index 0000000..dcc8395
Binary files /dev/null and b/Source/btnImages/TestRelays.png differ
diff --git a/Source/btnImages/UpArrow64.png b/Source/btnImages/UpArrow64.png
new file mode 100644
index 0000000..5a4d6db
Binary files /dev/null and b/Source/btnImages/UpArrow64.png differ
diff --git a/Source/btnImages/VehFileLoad.png b/Source/btnImages/VehFileLoad.png
new file mode 100644
index 0000000..b119ca6
Binary files /dev/null and b/Source/btnImages/VehFileLoad.png differ
diff --git a/Source/btnImages/VehFileSave.png b/Source/btnImages/VehFileSave.png
new file mode 100644
index 0000000..8bdcbb2
Binary files /dev/null and b/Source/btnImages/VehFileSave.png differ
diff --git a/Source/btnImages/WindowsShutDown.png b/Source/btnImages/WindowsShutDown.png
new file mode 100644
index 0000000..2e8a0e7
Binary files /dev/null and b/Source/btnImages/WindowsShutDown.png differ
diff --git a/Source/btnImages/back-button.png b/Source/btnImages/back-button.png
new file mode 100644
index 0000000..3331597
Binary files /dev/null and b/Source/btnImages/back-button.png differ
diff --git a/Source/btnImages/trash.png b/Source/btnImages/trash.png
new file mode 100644
index 0000000..4b70184
Binary files /dev/null and b/Source/btnImages/trash.png differ
diff --git a/Source/btnImages/www.png b/Source/btnImages/www.png
new file mode 100644
index 0000000..780bf02
Binary files /dev/null and b/Source/btnImages/www.png differ
diff --git a/Source/gStr.Designer.cs b/Source/gStr.Designer.cs
new file mode 100644
index 0000000..a8f43f4
--- /dev/null
+++ b/Source/gStr.Designer.cs
@@ -0,0 +1,153 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace AgTwo {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class gStr {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal gStr() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AgTwo.gStr", typeof(gStr).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/03.-AgTwo-Orientation.
+ ///
+ internal static string gsAgIOHelp {
+ get {
+ return ResourceManager.GetString("gsAgIOHelp", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Authourizing.
+ ///
+ internal static string gsAuthourizing {
+ get {
+ return ResourceManager.GetString("gsAuthourizing", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/05.-Ethernet-Setup.
+ ///
+ internal static string gsEthernetHelp {
+ get {
+ return ResourceManager.GetString("gsEthernetHelp", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Listening.
+ ///
+ internal static string gsListening {
+ get {
+ return ResourceManager.GetString("gsListening", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to NTRIP.
+ ///
+ internal static string gsNTRIP {
+ get {
+ return ResourceManager.GetString("gsNTRIP", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/04.-RTK-Setup.
+ ///
+ internal static string gsNTRIP_Help {
+ get {
+ return ResourceManager.GetString("gsNTRIP_Help", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Save And Return.
+ ///
+ internal static string gsSaveAndReturn {
+ get {
+ return ResourceManager.GetString("gsSaveAndReturn", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Save Comms.
+ ///
+ internal static string gsSaveComms {
+ get {
+ return ResourceManager.GetString("gsSaveComms", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to https://github.com/farmerbriantee/AgOpenGPS/wiki/06.-Serial-Monitor.
+ ///
+ internal static string gsSerialMonHelp {
+ get {
+ return ResourceManager.GetString("gsSerialMonHelp", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waiting.
+ ///
+ internal static string gsWaiting {
+ get {
+ return ResourceManager.GetString("gsWaiting", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/Source/gStr.resx b/Source/gStr.resx
new file mode 100644
index 0000000..963a596
--- /dev/null
+++ b/Source/gStr.resx
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ https://github.com/farmerbriantee/AgOpenGPS/wiki/03.-AgTwo-Orientation
+
+
+ Authourizing
+
+
+ https://github.com/farmerbriantee/AgOpenGPS/wiki/05.-Ethernet-Setup
+
+
+ Listening
+
+
+ NTRIP
+
+
+ https://github.com/farmerbriantee/AgOpenGPS/wiki/04.-RTK-Setup
+
+
+ Save And Return
+
+
+ Save Comms
+
+
+ https://github.com/farmerbriantee/AgOpenGPS/wiki/06.-Serial-Monitor
+
+
+ Waiting
+
+
\ No newline at end of file