From a2da2e39fcec84bcfdbd42932fec78ff2e6becb7 Mon Sep 17 00:00:00 2001 From: Szymon Porwolik Date: Sat, 23 Feb 2019 03:12:12 +0100 Subject: [PATCH] Major update - first working version --- 01_DCS/Hooks/Perun.lua | 143 +++++ 01_DCS/Json/perun_export.json | 0 01_DCS/Perun.lua | 122 ---- 02_Windows_App/{Perun_v1.sln => Perun.sln} | 0 02_Windows_App/Perun_v1/App.config | 33 + 02_Windows_App/Perun_v1/Perun_v1.csproj | 65 ++ 02_Windows_App/Perun_v1/Program.cs | 16 +- .../Perun_v1/Properties/AssemblyInfo.cs | 17 +- .../Perun_v1/Properties/Resources.Designer.cs | 60 +- .../Perun_v1/Properties/Settings.Designer.cs | 126 +++- .../Perun_v1/Properties/Settings.settings | 35 +- 02_Windows_App/Perun_v1/form_Main.Designer.cs | 323 +++++++++- 02_Windows_App/Perun_v1/form_Main.cs | 337 +++++++++- 02_Windows_App/Perun_v1/form_Main.resx | 582 ++++++++++++++++++ 02_Windows_App/Perun_v1/packages.config | 6 + 02_Windows_App/Perun_v1/perun_logo.ico | Bin 0 -> 16694 bytes 16 files changed, 1651 insertions(+), 214 deletions(-) create mode 100644 01_DCS/Hooks/Perun.lua create mode 100644 01_DCS/Json/perun_export.json delete mode 100644 01_DCS/Perun.lua rename 02_Windows_App/{Perun_v1.sln => Perun.sln} (100%) create mode 100644 02_Windows_App/Perun_v1/packages.config create mode 100644 02_Windows_App/Perun_v1/perun_logo.ico diff --git a/01_DCS/Hooks/Perun.lua b/01_DCS/Hooks/Perun.lua new file mode 100644 index 0000000..ad50650 --- /dev/null +++ b/01_DCS/Hooks/Perun.lua @@ -0,0 +1,143 @@ +-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook component + +-- Initial init + local Perun = {} + package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua" + package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll" + +-- ########### SETTINGS ########### + + Perun.Refresh = 15 -- base refresh rate in secounds (values lower than 60 may affect performance!) + Perun.JsonLocation = "Scripts\\Json\\perun_export.json" -- relatve do user's SaveGames DCS folder + Perun.UDPTargetPort = 48620 -- UDP port to send data to + +-- ########### END OF SETTINGS ########### + +-- Variable init + Perun.Version = "v0.1.1" + Perun.StatusData = {} + Perun.MissionData = {} + Perun.VersionData = {} + Perun.lastSent =0 + Perun.JsonLocation = lfs.writedir() .. Perun.JsonLocation + Perun.socket = require("socket") + Perun.UDP = assert(Perun.socket.udp()) + Perun.UDP:settimeout(0) + Perun.UDP:setsockname("*", 48621) + Perun.UDP:setpeername("127.0.0.1",Perun.UDPTargetPort) + Perun.UDP:send("{'type':999,'payload':'Perun is onlne!'}") -- send welcome message + +-- Function definition + Perun.AddLog = function(text) + -- Adds logs to DCS.log file + net.log("Perun : ".. text) + end + + Perun.UpdateJson = function() + -- Updates main json file + TempData={} + TempData["1"]=Perun.VersionData + TempData["2"]=Perun.StatusData + TempData["3"]=Perun.MissionData + + io.open(Perun.JsonLocation,"w"):close() + perun_export = io.open(Perun.JsonLocation, "w") + perun_export:write(net.lua2json(TempData) .. "\n") + perun_export:close() + end + + Perun.Send = function(data_id, data_package) + -- Sends data package + TempData={} + TempData["type"]=data_id + TempData["payload"]=data_package + + temp=net.lua2json(TempData) + Perun.UDP:send(temp) + Perun.AddLog("Packet send") + end + + Perun.UpdateStatusPart = function(part_id, data_package) + -- Helper for status update container + Perun.StatusData[part_id] = data_package + end + + Perun.UpdateVersion = function() + -- Main function for debug/version information + + -- Update Mission data + Perun.VersionData['v_dcs_hook']=Perun.Version + + -- Send + Perun.Send(1,Perun.VersionData) + end + + Perun.UpdateStatus = function() + -- Main function for status updates + + -- Update all subsections + -- 1 - Mission + temp={} + temp['name']=DCS.getMissionName() + temp['filename']=DCS.getMissionFilename() + temp['modeltime']=DCS.getModelTime() + temp['realtime']=DCS.getRealTime() + temp['pause']=DCS.getPause() + temp['multiplayer']=DCS.isMultiplayer() + Perun.UpdateStatusPart("mission",temp) + + -- 2 - Players + temp = net.get_player_list() + for _, i in ipairs(temp) do + temp[i]=net.get_player_info(i) + end + Perun.UpdateStatusPart("players",temp) + + -- Send + Perun.Send(2,Perun.StatusData) + end + + Perun.UpdateMission = function() + -- Main function for mission information updates + + -- Update Mission data + Perun.MissionData['name']=DCS.getMissionName() + Perun.MissionData['description']=DCS.getMissionDescription() + Perun.MissionData['filename']=DCS.getMissionFilename() + Perun.MissionData['modeltime']=DCS.getModelTime() + Perun.MissionData['realtime']=DCS.getRealTime() + Perun.MissionData['data']=DCS.getCurrentMission() + Perun.MissionData['coalitions']=DCS.getAvailableCoalitions() + Perun.MissionData['slots']={} + + for j, i in pairs(Perun.MissionData['coalitions']) do + Perun.MissionData['slots'][j]=DCS.getAvailableSlots(j) + end + -- Send + Perun.Send(3,Perun.MissionData) + end + + +--- Event callbacks + Perun.onSimulationFrame = function() + local _now = DCS.getRealTime() + + if _now > Perun.lastSent + Perun.Refresh then + Perun.lastSent = _now + + Perun.UpdateMission() + Perun.UpdateStatus() + Perun.UpdateVersion() + Perun.UpdateJson() + end + + end + + Perun.onMissionLoadEnd = function() + Perun.UpdateMission() + Perun.UpdateJson() + end + +-- Finalize and set callbacks + DCS.setUserCallbacks(Perun) + net.log("Loaded - Perun - VladMordock - " .. Perun.Version ) \ No newline at end of file diff --git a/01_DCS/Json/perun_export.json b/01_DCS/Json/perun_export.json new file mode 100644 index 0000000..e69de29 diff --git a/01_DCS/Perun.lua b/01_DCS/Perun.lua deleted file mode 100644 index 36a9626..0000000 --- a/01_DCS/Perun.lua +++ /dev/null @@ -1,122 +0,0 @@ --- Perun hook by VladMordock - -local Perun = {} - -Perun.Version = "0.1" -Perun.Refresh = 15 -Perun.StatusData = {} -Perun.MissionData = {} - -local _lastSent = 0; - -local json_path = lfs.writedir() .."Scripts\\Json\\perun_export.json" - -package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua" -package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll" - -socket = require("socket") -Perun.UDP = assert(socket.udp()) -Perun.UDP:settimeout(0) -Perun.UDP:setsockname("*", 48621) -Perun.UDP:setpeername("127.0.0.1",48620) - -Perun.UDP:send("Perun online!") - -Perun.AddLog = function(text) - net.log("Perun : ".. text) -end - -Perun.UpdateJson = function() - TempData={} - TempData["1"]=Perun.StatusData - TempData["2"]=Perun.MissionData - - io.open(json_path,"w"):close() - perun_export = io.open(json_path, "w") - perun_export:write(net.lua2json(TempData) .. "\n") - perun_export:close() -end - -Perun.Send = function(data_id, data_package) - TempData={} - TempData["type"]=data_id - TempData["payload"]=Perun.StatusData - - temp=net.lua2json(TempData) - Perun.UDP:send(temp) - Perun.AddLog("Packet send") -end - -Perun.UpdateStatusPart = function(part_id, data_package) - Perun.StatusData[part_id] = data_package -end - -Perun.UpdateStatus = function() - -- 1 - Update time - Perun.UpdateStatusPart("updated","TODO: OS TIME") - - -- 2 - Mission - temp={} - temp['name']=DCS.getMissionName() - temp['filename']=DCS.getMissionFilename() - temp['modeltime']=DCS.getModelTime() - temp['realtime']=DCS.getRealTime() - temp['pause']=DCS.getPause() - temp['multiplayer']=DCS.isMultiplayer() - Perun.UpdateStatusPart("mission",temp) - - -- 3 - Players - temp = net.get_player_list() - for _, i in ipairs(temp) do - temp[i]=net.get_player_info(i) - end - Perun.UpdateStatusPart("players",temp) - - -- Send - Perun.Send(1,Perun.StatusData) -end - -Perun.UpdateMission = function() - -- Mission data - Perun.MissionData['updated']="TODO: OS TIME" - Perun.MissionData['name']=DCS.getMissionName() - Perun.MissionData['description']=DCS.getMissionDescription() - Perun.MissionData['filename']=DCS.getMissionFilename() - Perun.MissionData['modeltime']=DCS.getModelTime() - Perun.MissionData['realtime']=DCS.getRealTime() - Perun.MissionData['data']=DCS.getCurrentMission() - Perun.MissionData['coalitions']=DCS.getAvailableCoalitions() - Perun.MissionData['slots']={} - - for j, i in pairs(Perun.MissionData['coalitions']) do - Perun.MissionData['slots'][j]=DCS.getAvailableSlots(j) - end - -- Send - Perun.Send(2,Perun.MissionData) -end - - ---- Event callback - -Perun.onSimulationFrame = function() - local _now = DCS.getRealTime() - - if _now > _lastSent + Perun.Refresh then - _lastSent = _now - - Perun.UpdateMission() - Perun.UpdateStatus() - Perun.UpdateJson() - end - -end - -Perun.onMissionLoadEnd = function() - Perun.UpdateMission() - Perun.UpdateJson() -end - ---- Finalize and set callbacks - -DCS.setUserCallbacks(Perun) -net.log("Loaded - Perun - VladMordock - " .. Perun.Version ) \ No newline at end of file diff --git a/02_Windows_App/Perun_v1.sln b/02_Windows_App/Perun.sln similarity index 100% rename from 02_Windows_App/Perun_v1.sln rename to 02_Windows_App/Perun.sln diff --git a/02_Windows_App/Perun_v1/App.config b/02_Windows_App/Perun_v1/App.config index 731f6de..1a14eda 100644 --- a/02_Windows_App/Perun_v1/App.config +++ b/02_Windows_App/Perun_v1/App.config @@ -1,6 +1,39 @@  + + +
+ + + + + + + + + + + + + + + + + + + + + + + + False + + + False + + + \ No newline at end of file diff --git a/02_Windows_App/Perun_v1/Perun_v1.csproj b/02_Windows_App/Perun_v1/Perun_v1.csproj index 4fa822b..e9bf3b5 100644 --- a/02_Windows_App/Perun_v1/Perun_v1.csproj +++ b/02_Windows_App/Perun_v1/Perun_v1.csproj @@ -12,6 +12,22 @@ 512 true true + false + C:\Users\simpo\Desktop\Perun\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 1 + 1.0.0.%2a + false + true + true AnyCPU @@ -32,9 +48,40 @@ prompt 4 + + perun_logo.ico + + + 2ACE4C8C2C325A04CA5986B1CD76744B4B03755D + + + Perun_v1_TemporaryKey.pfx + + + true + + + true + + + ..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll + + + ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + + + + + + + + @@ -65,7 +112,10 @@ True Resources.resx + True + + SettingsSingleFileGenerator Settings.Designer.cs @@ -79,5 +129,20 @@ + + + False + Microsoft .NET Framework 4.6.1 %28x86 i x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/02_Windows_App/Perun_v1/Program.cs b/02_Windows_App/Perun_v1/Program.cs index 0394a13..0d3e1a5 100644 --- a/02_Windows_App/Perun_v1/Program.cs +++ b/02_Windows_App/Perun_v1/Program.cs @@ -1,22 +1,32 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; namespace Perun_v1 { + static class Program { /// /// Główny punkt wejścia dla aplikacji. /// [STAThread] + + static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + + Application.ApplicationExit += new EventHandler(Application_ApplicationExit); + + void Application_ApplicationExit(object sender, EventArgs e) + { + Properties.Settings.Default.Save(); + } + Application.Run(new form_Main()); } + + } } diff --git a/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs b/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs index 8867272..02a1660 100644 --- a/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs +++ b/02_Windows_App/Perun_v1/Properties/AssemblyInfo.cs @@ -1,15 +1,16 @@ -using System.Reflection; +using System.Resources; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Ogólne informacje o zestawie są kontrolowane poprzez następujący // zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje // powiązane z zestawem. -[assembly: AssemblyTitle("Perun_v1")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyTitle("Perun for DCS World")] +[assembly: AssemblyDescription("https://github.com/szporwolik/perun")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Perun_v1")] +[assembly: AssemblyCompany("Szymon Porwolik")] +[assembly: AssemblyProduct("Perun for DCS World")] [assembly: AssemblyCopyright("Copyright © 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +33,7 @@ using System.Runtime.InteropServices; // Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki // przy użyciu symbolu „*”, tak jak pokazano poniżej: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.0.0")] +[assembly: AssemblyFileVersion("0.1.0.0")] +[assembly: NeutralResourcesLanguage("en")] + diff --git a/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs b/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs index 3dcfd19..9aee274 100644 --- a/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs +++ b/02_Windows_App/Perun_v1/Properties/Resources.Designer.cs @@ -1,69 +1,61 @@ //------------------------------------------------------------------------------ // // Ten kod został wygenerowany przez narzędzie. -// Wersja środowiska uruchomieniowego: 4.0.30319.42000 +// Wersja wykonawcza:4.0.30319.42000 // -// Modyfikacje tego pliku mogą spowodować niewłaściwe zachowanie i zostaną utracone -// w przypadku ponownego wygenerowania kodu. +// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli +// kod zostanie ponownie wygenerowany. // //------------------------------------------------------------------------------ -namespace Perun_v1.Properties -{ - - +namespace Perun_v1.Properties { + using System; + + /// - /// Silnie typizowana klasa zasobów do wyszukiwania zlokalizowanych ciągów itd. + /// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd. /// // Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder // przez narzędzie, takie jak ResGen lub Visual Studio. - // Aby dodać lub usunąć składowe, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen - // z opcją /str lub ponownie skompiluj projekt programu VS. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + // Aby dodać lub usunąć składową, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen + // z opcją /str lub ponownie utwórz projekt VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + 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() - { + internal Resources() { } - + /// - /// Zwraca buforowane wystąpienie składnika ResourceManager używane przez tę klasę. + /// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perun_v1.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich - /// przypadków przeszukiwania zasobów za pomocą tej silnie typizowanej klasy zasobów. + /// przypadków przeszukiwania zasobów za pomocą tej klasy zasobów wymagającej zdefiniowania typu. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs b/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs index 66c6209..1b53716 100644 --- a/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs +++ b/02_Windows_App/Perun_v1/Properties/Settings.Designer.cs @@ -1,30 +1,122 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// Ten kod został wygenerowany przez narzędzie. +// Wersja wykonawcza:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli +// kod zostanie ponownie wygenerowany. // //------------------------------------------------------------------------------ -namespace Perun_v1.Properties -{ - - +namespace Perun_v1.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.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 - { + + public static Settings Default { + get { return defaultInstance; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MYSQL_Server { + get { + return ((string)(this["MYSQL_Server"])); + } + set { + this["MYSQL_Server"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MYSQL_User { + get { + return ((string)(this["MYSQL_User"])); + } + set { + this["MYSQL_User"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MYSQL_Password { + get { + return ((string)(this["MYSQL_Password"])); + } + set { + this["MYSQL_Password"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MYSQL_DB { + get { + return ((string)(this["MYSQL_DB"])); + } + set { + this["MYSQL_DB"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string OTHER_LOTATC_FILE { + get { + return ((string)(this["OTHER_LOTATC_FILE"])); + } + set { + this["OTHER_LOTATC_FILE"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string OTHER_SRS_FILE { + get { + return ((string)(this["OTHER_SRS_FILE"])); + } + set { + this["OTHER_SRS_FILE"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool OTHER_LOTATC_USE { + get { + return ((bool)(this["OTHER_LOTATC_USE"])); + } + set { + this["OTHER_LOTATC_USE"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool OTHER_SRS_USE { + get { + return ((bool)(this["OTHER_SRS_USE"])); + } + set { + this["OTHER_SRS_USE"] = value; + } + } } } diff --git a/02_Windows_App/Perun_v1/Properties/Settings.settings b/02_Windows_App/Perun_v1/Properties/Settings.settings index 3964565..e967b56 100644 --- a/02_Windows_App/Perun_v1/Properties/Settings.settings +++ b/02_Windows_App/Perun_v1/Properties/Settings.settings @@ -1,7 +1,30 @@  - - - - - - + + + + + + + + + + + + + + + + + + + + + + + False + + + False + + + \ No newline at end of file diff --git a/02_Windows_App/Perun_v1/form_Main.Designer.cs b/02_Windows_App/Perun_v1/form_Main.Designer.cs index 9a68716..65867ed 100644 --- a/02_Windows_App/Perun_v1/form_Main.Designer.cs +++ b/02_Windows_App/Perun_v1/form_Main.Designer.cs @@ -28,46 +28,339 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(form_Main)); this.con_List_Received = new System.Windows.Forms.ListBox(); - this.con_Button_DEBUG = new System.Windows.Forms.Button(); + this.con_Button_Listen_ON = new System.Windows.Forms.Button(); + this.con_Button_Listen_OFF = new System.Windows.Forms.Button(); + this.con_GroupBox_1 = new System.Windows.Forms.GroupBox(); + this.tim_1000ms = new System.Windows.Forms.Timer(this.components); + this.con_GroupBox_2 = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.con_txt_mysql_username = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.con_txt_mysql_database = new System.Windows.Forms.TextBox(); + this.con_txt_mysql_server = new System.Windows.Forms.TextBox(); + this.con_txt_mysql_password = new System.Windows.Forms.MaskedTextBox(); + this.con_GroupBox_3 = new System.Windows.Forms.GroupBox(); + this.con_txt_3rd_lotatc = new System.Windows.Forms.MaskedTextBox(); + this.con_txt_3rd_srs = new System.Windows.Forms.MaskedTextBox(); + this.con_check_3rd_lotatc = new System.Windows.Forms.CheckBox(); + this.con_check_3rd_srs = new System.Windows.Forms.CheckBox(); + this.con_Button_Quit = new System.Windows.Forms.Button(); + this.con_lab_github = new System.Windows.Forms.LinkLabel(); + this.label5 = new System.Windows.Forms.Label(); + this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components); + this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog(); + this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog(); + this.tim_10000ms = new System.Windows.Forms.Timer(this.components); + this.con_GroupBox_1.SuspendLayout(); + this.con_GroupBox_2.SuspendLayout(); + this.con_GroupBox_3.SuspendLayout(); this.SuspendLayout(); // // con_List_Received // + this.con_List_Received.Enabled = false; this.con_List_Received.FormattingEnabled = true; - this.con_List_Received.Location = new System.Drawing.Point(12, 12); + this.con_List_Received.Items.AddRange(new object[] { + "Loading", + "Loading", + "Loading", + "Loading", + "Loading", + "Loading", + "Loading", + "Loading", + "Loading", + "Loading"}); + this.con_List_Received.Location = new System.Drawing.Point(6, 19); this.con_List_Received.Name = "con_List_Received"; - this.con_List_Received.Size = new System.Drawing.Size(594, 550); + this.con_List_Received.Size = new System.Drawing.Size(307, 134); this.con_List_Received.TabIndex = 0; // - // con_Button_DEBUG + // con_Button_Listen_ON // - this.con_Button_DEBUG.Location = new System.Drawing.Point(612, 21); - this.con_Button_DEBUG.Name = "con_Button_DEBUG"; - this.con_Button_DEBUG.Size = new System.Drawing.Size(80, 48); - this.con_Button_DEBUG.TabIndex = 1; - this.con_Button_DEBUG.Text = "Debug"; - this.con_Button_DEBUG.UseVisualStyleBackColor = true; - this.con_Button_DEBUG.Click += new System.EventHandler(this.con_Button_DEBUG_Click); + this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 405); + this.con_Button_Listen_ON.Name = "con_Button_Listen_ON"; + this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39); + this.con_Button_Listen_ON.TabIndex = 2; + this.con_Button_Listen_ON.Text = "Connect"; + this.con_Button_Listen_ON.UseVisualStyleBackColor = true; + this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click); + // + // con_Button_Listen_OFF + // + this.con_Button_Listen_OFF.Enabled = false; + this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 405); + this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF"; + this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39); + this.con_Button_Listen_OFF.TabIndex = 3; + this.con_Button_Listen_OFF.Text = "Disconnect"; + this.con_Button_Listen_OFF.UseVisualStyleBackColor = true; + this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click); + // + // con_GroupBox_1 + // + this.con_GroupBox_1.Controls.Add(this.con_List_Received); + this.con_GroupBox_1.Location = new System.Drawing.Point(12, 235); + this.con_GroupBox_1.Name = "con_GroupBox_1"; + this.con_GroupBox_1.Size = new System.Drawing.Size(324, 164); + this.con_GroupBox_1.TabIndex = 4; + this.con_GroupBox_1.TabStop = false; + this.con_GroupBox_1.Text = "UDP log"; + // + // tim_1000ms + // + this.tim_1000ms.Interval = 1000; + this.tim_1000ms.Tick += new System.EventHandler(this.timer1_Tick); + // + // con_GroupBox_2 + // + this.con_GroupBox_2.Controls.Add(this.label4); + this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username); + this.con_GroupBox_2.Controls.Add(this.label3); + this.con_GroupBox_2.Controls.Add(this.label2); + this.con_GroupBox_2.Controls.Add(this.label1); + this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database); + this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server); + this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password); + this.con_GroupBox_2.Location = new System.Drawing.Point(12, 27); + this.con_GroupBox_2.Name = "con_GroupBox_2"; + this.con_GroupBox_2.Size = new System.Drawing.Size(324, 127); + this.con_GroupBox_2.TabIndex = 5; + this.con_GroupBox_2.TabStop = false; + this.con_GroupBox_2.Text = "MySQL"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(45, 74); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(55, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Username"; + // + // con_txt_mysql_username + // + this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 71); + this.con_txt_mysql_username.Name = "con_txt_mysql_username"; + this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20); + this.con_txt_mysql_username.TabIndex = 6; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(47, 100); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(53, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Password"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(47, 48); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Database"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(22, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(78, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Server address"; + // + // con_txt_mysql_database + // + this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 45); + this.con_txt_mysql_database.Name = "con_txt_mysql_database"; + this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20); + this.con_txt_mysql_database.TabIndex = 2; + // + // con_txt_mysql_server + // + this.con_txt_mysql_server.Location = new System.Drawing.Point(106, 19); + this.con_txt_mysql_server.Name = "con_txt_mysql_server"; + this.con_txt_mysql_server.Size = new System.Drawing.Size(207, 20); + this.con_txt_mysql_server.TabIndex = 1; + // + // con_txt_mysql_password + // + this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 97); + this.con_txt_mysql_password.Name = "con_txt_mysql_password"; + this.con_txt_mysql_password.PasswordChar = '*'; + this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20); + this.con_txt_mysql_password.TabIndex = 0; + // + // con_GroupBox_3 + // + this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_lotatc); + this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs); + this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc); + this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs); + this.con_GroupBox_3.Location = new System.Drawing.Point(12, 160); + this.con_GroupBox_3.Name = "con_GroupBox_3"; + this.con_GroupBox_3.Size = new System.Drawing.Size(324, 69); + this.con_GroupBox_3.TabIndex = 6; + this.con_GroupBox_3.TabStop = false; + this.con_GroupBox_3.Text = "3rd Party"; + // + // con_txt_3rd_lotatc + // + this.con_txt_3rd_lotatc.Location = new System.Drawing.Point(123, 39); + this.con_txt_3rd_lotatc.Name = "con_txt_3rd_lotatc"; + this.con_txt_3rd_lotatc.Size = new System.Drawing.Size(190, 20); + this.con_txt_3rd_lotatc.TabIndex = 4; + this.con_txt_3rd_lotatc.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_lotatc_Click); + // + // con_txt_3rd_srs + // + this.con_txt_3rd_srs.Location = new System.Drawing.Point(123, 16); + this.con_txt_3rd_srs.Name = "con_txt_3rd_srs"; + this.con_txt_3rd_srs.Size = new System.Drawing.Size(190, 20); + this.con_txt_3rd_srs.TabIndex = 3; + this.con_txt_3rd_srs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_srs_Click); + // + // con_check_3rd_lotatc + // + this.con_check_3rd_lotatc.AutoSize = true; + this.con_check_3rd_lotatc.Location = new System.Drawing.Point(6, 42); + this.con_check_3rd_lotatc.Name = "con_check_3rd_lotatc"; + this.con_check_3rd_lotatc.Size = new System.Drawing.Size(100, 17); + this.con_check_3rd_lotatc.TabIndex = 1; + this.con_check_3rd_lotatc.Text = "LotATC json file"; + this.con_check_3rd_lotatc.UseVisualStyleBackColor = true; + // + // con_check_3rd_srs + // + this.con_check_3rd_srs.AutoSize = true; + this.con_check_3rd_srs.Location = new System.Drawing.Point(6, 19); + this.con_check_3rd_srs.Name = "con_check_3rd_srs"; + this.con_check_3rd_srs.Size = new System.Drawing.Size(111, 17); + this.con_check_3rd_srs.TabIndex = 0; + this.con_check_3rd_srs.Text = "DCS SRS json file"; + this.con_check_3rd_srs.UseVisualStyleBackColor = true; + // + // con_Button_Quit + // + this.con_Button_Quit.Location = new System.Drawing.Point(250, 405); + this.con_Button_Quit.Name = "con_Button_Quit"; + this.con_Button_Quit.Size = new System.Drawing.Size(86, 39); + this.con_Button_Quit.TabIndex = 7; + this.con_Button_Quit.Text = "Quit"; + this.con_Button_Quit.UseVisualStyleBackColor = true; + this.con_Button_Quit.Click += new System.EventHandler(this.con_Button_Quit_Click); + // + // con_lab_github + // + this.con_lab_github.AutoSize = true; + this.con_lab_github.Location = new System.Drawing.Point(141, 9); + this.con_lab_github.Name = "con_lab_github"; + this.con_lab_github.Size = new System.Drawing.Size(181, 13); + this.con_lab_github.TabIndex = 8; + this.con_lab_github.TabStop = true; + this.con_lab_github.Text = "https://github.com/szporwolik/perun"; + this.con_lab_github.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.con_lab_github_LinkClicked); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(15, 9); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(120, 13); + this.label5.TabIndex = 9; + this.label5.Text = "Manual and bugtracker:"; + // + // trayIconMain + // + this.trayIconMain.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.trayIconMain.BalloonTipText = "Perun"; + this.trayIconMain.BalloonTipTitle = "Perun for DCS World"; + this.trayIconMain.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIconMain.Icon"))); + this.trayIconMain.Text = "Perun for DCS World"; + this.trayIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick); + this.trayIconMain.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick); + // + // openFileDialog_SRS + // + this.openFileDialog_SRS.FileName = "openFileDialog1"; + // + // openFileDialog_LotATC + // + this.openFileDialog_LotATC.FileName = "openFileDialog1"; + // + // tim_10000ms + // + this.tim_10000ms.Interval = 10000; + this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick); // // form_Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(738, 567); - this.Controls.Add(this.con_Button_DEBUG); - this.Controls.Add(this.con_List_Received); + this.ClientSize = new System.Drawing.Size(348, 456); + this.Controls.Add(this.label5); + this.Controls.Add(this.con_lab_github); + this.Controls.Add(this.con_Button_Quit); + this.Controls.Add(this.con_GroupBox_3); + this.Controls.Add(this.con_GroupBox_2); + this.Controls.Add(this.con_GroupBox_1); + this.Controls.Add(this.con_Button_Listen_OFF); + this.Controls.Add(this.con_Button_Listen_ON); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; this.Name = "form_Main"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Perun for DCS World"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing); this.Load += new System.EventHandler(this.form_Main_Load); + this.con_GroupBox_1.ResumeLayout(false); + this.con_GroupBox_2.ResumeLayout(false); + this.con_GroupBox_2.PerformLayout(); + this.con_GroupBox_3.ResumeLayout(false); + this.con_GroupBox_3.PerformLayout(); this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.ListBox con_List_Received; - private System.Windows.Forms.Button con_Button_DEBUG; + private System.Windows.Forms.Button con_Button_Listen_ON; + private System.Windows.Forms.Button con_Button_Listen_OFF; + private System.Windows.Forms.GroupBox con_GroupBox_1; + private System.Windows.Forms.Timer tim_1000ms; + private System.Windows.Forms.GroupBox con_GroupBox_2; + private System.Windows.Forms.GroupBox con_GroupBox_3; + private System.Windows.Forms.TextBox con_txt_mysql_database; + private System.Windows.Forms.TextBox con_txt_mysql_server; + private System.Windows.Forms.MaskedTextBox con_txt_mysql_password; + private System.Windows.Forms.Button con_Button_Quit; + private System.Windows.Forms.MaskedTextBox con_txt_3rd_lotatc; + private System.Windows.Forms.MaskedTextBox con_txt_3rd_srs; + private System.Windows.Forms.CheckBox con_check_3rd_lotatc; + private System.Windows.Forms.CheckBox con_check_3rd_srs; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox con_txt_mysql_username; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.LinkLabel con_lab_github; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NotifyIcon trayIconMain; + private System.Windows.Forms.OpenFileDialog openFileDialog_SRS; + private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC; + private System.Windows.Forms.Timer tim_10000ms; } } diff --git a/02_Windows_App/Perun_v1/form_Main.cs b/02_Windows_App/Perun_v1/form_Main.cs index cfea823..fc7617c 100644 --- a/02_Windows_App/Perun_v1/form_Main.cs +++ b/02_Windows_App/Perun_v1/form_Main.cs @@ -1,30 +1,347 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Reflection; using System.Text; -using System.Threading.Tasks; +using System.Threading; using System.Windows.Forms; +using MySql.Data.MySqlClient; +using Newtonsoft.Json; + namespace Perun_v1 { public partial class form_Main : Form { - public form_Main() + + // Variable definitions + public Thread thread_UDPListener; // Seperate thread for UDP + public class_UDPListener UDPListener; // Helper class for UDP comunication + public string[] LogHistory=new string[10]; // Log history for GUI + public string[] SendBuffer=new string[10]; // Mysql send buffer + public bool LetMeOut=false; // Helper to handle system tray + public string MySql_connStr; // MySQL connection string + + public static void LogHistoryAdd(ref string[] LogHistory, string Comment) { - InitializeComponent(); + // Add to log history and rotate + for (int i = 0; i < LogHistory.Length - 1; i++) + { + LogHistory[i] = LogHistory[i + 1]; + } + LogHistory[9] = DateTime.Now.ToString("HH:mm:ss") + " > " + Comment; } - private void con_Button_DEBUG_Click(object sender, EventArgs e) + public void SendToMySql(string raw_udp_frame) { - con_List_Received.Items.Add("test"); + // Main function to send data to mysql + // TODO : persistent connection and error handling + + dynamic udp_frame = JsonConvert.DeserializeObject(raw_udp_frame); + + // Cut raw data to type and paylod for proper mysql insert + string type = udp_frame.type; + + + // Type specyfic + if (type == "1") // Inject app version information + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location); + string version = fileVersionInfo.ProductVersion; + udp_frame.payload["v_win"] = "v"+version; + } + + string payload = JsonConvert.SerializeObject(udp_frame.payload); + // Connect to mysql + MySqlConnection conn = new MySqlConnection(MySql_connStr); + try + { + Console.WriteLine("Sending data to MySQL - Begin"); + conn.Open(); + + string sql = "INSERT INTO pe_DataRaw(pe_dataraw_type,pe_dataraw_payload) VALUES (" + type+",JSON_QUOTE('" + payload + "')) ON DUPLICATE KEY UPDATE pe_dataraw_payload = JSON_QUOTE('" + payload + "')"; + + MySqlCommand cmd = new MySqlCommand(sql, conn); + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Console.WriteLine(rdr[0] + " -- " + rdr[1]); + } + rdr.Close(); + LogHistoryAdd(ref LogHistory, "MySQL updated, package type: "+ type); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + LogHistoryAdd(ref LogHistory, "ERROR: MySQL"); + } + + conn.Close(); + Console.WriteLine("Sending data to MySQL - Done"); + } + + + + public class class_UDPListener + { + // Main class for UDP listener + int listenPort; // Port to listen at + public bool done; // Helper to exit main loop without killing thread + public UdpClient listener; // Listener object + public string[] LogHistory; // Log history for GUI + public string[] SendBuffer; // Mysql send buffer + + public class_UDPListener(int port, ref string[] LogHistory, ref string[] SendBuffer) + { + // Create clas - NOTE that there is reference passing + this.listenPort = port; + this.LogHistory = LogHistory; + this.SendBuffer = SendBuffer; + } + + public void StartListen() + { + // Start listening to UDP + this.done = false; + listener = new UdpClient(listenPort); + IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort); + string received_data; + byte[] receive_byte_array; + + Console.WriteLine("UDP Listen start"); + try + { + while (!done) + { + Console.WriteLine("UDP: Waiting for packet"); + receive_byte_array = listener.Receive(ref groupEP); + received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length); + + Console.WriteLine("Sender: {0} Payload: {1}", groupEP.ToString(), received_data); + + // Add to log history and rotate + dynamic udp_frame = JsonConvert.DeserializeObject(received_data); + string type = udp_frame.type; + LogHistoryAdd(ref LogHistory, "UDP packet received, type: "+ type); + + // Add to mySQL send buffer and rotate + for (int i = 0; i < SendBuffer.Length - 1; i++) + { + SendBuffer[i] = SendBuffer[i + 1]; + } + SendBuffer[9] = received_data; + + } + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + Console.WriteLine("UDP listen stop"); + listener.Close(); + } + } + + + public form_Main() + { + // Form init + InitializeComponent(); } private void form_Main_Load(object sender, EventArgs e) { + // Form loaded - fill controls with default values + LogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun loaded..."; + // Load settings + con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB; + con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User; + con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password; + con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server; + con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE; + con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE; + con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE; + con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE; + } + + private void con_Button_Listen_ON_Click(object sender, EventArgs e) + { + // Start listening + UDPListener = new class_UDPListener(48620,ref LogHistory, ref SendBuffer); + thread_UDPListener = new Thread(UDPListener.StartListen); + thread_UDPListener.Start(); + + // Update form controls + con_Button_Listen_ON.Enabled = false; + con_Button_Listen_OFF.Enabled = true; + + con_txt_mysql_database.Enabled = false; + con_txt_mysql_username.Enabled = false; + con_txt_mysql_password.Enabled = false; + con_txt_mysql_server.Enabled = false; + con_txt_3rd_lotatc.Enabled = false; + con_txt_3rd_srs.Enabled = false; + con_check_3rd_lotatc.Enabled = false; + con_check_3rd_srs.Enabled = false; + // Prepare connection string + MySql_connStr = "server="+con_txt_mysql_server.Text+";user="+con_txt_mysql_username.Text+";database="+con_txt_mysql_database.Text+";port=3306;password="+con_txt_mysql_password.Text; + + // Start timmers + tim_1000ms.Enabled = true; + tim_10000ms.Enabled = true; + } + + private void con_Button_Listen_OFF_Click(object sender, EventArgs e) + { + // Stop listening + UDPListener.listener.Close(); + + // Update form controls + con_Button_Listen_ON.Enabled = true; + con_Button_Listen_OFF.Enabled = false; + + con_txt_mysql_database.Enabled = true; + con_txt_mysql_username.Enabled = true; + con_txt_mysql_password.Enabled = true; + con_txt_mysql_server.Enabled = true; + con_txt_3rd_lotatc.Enabled = true; + con_txt_3rd_srs.Enabled = true; + con_check_3rd_lotatc.Enabled = true; + con_check_3rd_srs.Enabled = true; + + // Stop timmers + tim_1000ms.Enabled = false; + tim_10000ms.Enabled = false; + } + + private void timer1_Tick(object sender, EventArgs e) + { + // Main timer to sync GUI with background tasks and flush buffers + // Refresh Log Window + con_List_Received.Items.Clear(); + foreach (string i in LogHistory) + { + if (i != null) + { + con_List_Received.Items.Add(i); + } + } + + // Send buffer to MySQL + for (int i = 0; i < SendBuffer.Length - 1; i++) + { + if (SendBuffer[i] != null) + { + SendToMySql(SendBuffer[i]); + SendBuffer[i] = null; + } + } + } + + private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + // Open default browser with link to Perun repo + ProcessStartInfo sInfo = new ProcessStartInfo("https://github.com/szporwolik/perun"); + Process.Start(sInfo); + } + + private void con_Button_Quit_Click(object sender, EventArgs e) + { + // Close app + + DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question); + if (dialogResult == DialogResult.Yes) + { + // Save settings on exit + Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text; + Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text; + Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text; + Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text; + Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text; + Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text; + Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text; + Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked; + Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked; + + Properties.Settings.Default.Save(); + + LetMeOut = true; + this.Close(); + } + else if (dialogResult == DialogResult.No) + { + //do nothing + } + } + + private void form_Main_FormClosing(object sender, FormClosingEventArgs e) + { + // Minimize to try + if (e.CloseReason == CloseReason.UserClosing && !LetMeOut) + { + e.Cancel = true; + trayIconMain.Visible = true; + this.WindowState = FormWindowState.Minimized; + this.ShowInTaskbar = false; + //this.Hide(); + + } + } + + private void trayIconMain_MouseDoubleClick(object sender, MouseEventArgs e) + { + // Maximize from try + trayIconMain.Visible = false; + this.WindowState = FormWindowState.Normal; + this.ShowInTaskbar = true; + + } + + private void con_txt_3rd_srs_Click(object sender, MouseEventArgs e) + { + // Chose SRS Json file + if (openFileDialog_SRS.ShowDialog() == DialogResult.OK) + { + con_txt_3rd_srs.Text = openFileDialog_SRS.FileName; + con_check_3rd_srs.Checked = true; + } else + { + con_txt_3rd_srs.Text = ""; + con_check_3rd_srs.Checked = false; + } + } + + private void con_txt_3rd_lotatc_Click(object sender, MouseEventArgs e) + { + // Chose LotATC Json file + if (openFileDialog_LotATC.ShowDialog() == DialogResult.OK) + { + con_txt_3rd_lotatc.Text = openFileDialog_LotATC.FileName; + con_check_3rd_lotatc.Checked = true; + } + else + { + con_txt_3rd_lotatc.Text = ""; + con_check_3rd_lotatc.Checked = false; + } + } + + private void tim_10000ms_Tick(object sender, EventArgs e) + { + // Main timer to send JSON files to MySQL + string strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text); + LogHistoryAdd(ref LogHistory, "SRS data loaded"); + string strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text); + LogHistoryAdd(ref LogHistory, "LotATC data loaded"); + + strSRSJson = "{'type':'100','payload':'" + strSRSJson + "'}"; + SendToMySql(strSRSJson); + strLotATCJson = "{'type':'101','payload':'" + strLotATCJson + "'}"; + SendToMySql(strLotATCJson); } } } diff --git a/02_Windows_App/Perun_v1/form_Main.resx b/02_Windows_App/Perun_v1/form_Main.resx index 1af7de1..91ed32d 100644 --- a/02_Windows_App/Perun_v1/form_Main.resx +++ b/02_Windows_App/Perun_v1/form_Main.resx @@ -117,4 +117,586 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 134, 17 + + + + + AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB + gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs + 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 + 7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs + 7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs + 7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs + 7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA + AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA + AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA + AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs + 7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs + 7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA + gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs + 7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs + 7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA + gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs + 7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs + 7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA + gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs + 7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs + 7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs + 7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA + AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA + AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs + 7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs + 7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs + 7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA + AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA + AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs + 7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs + 7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA + 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 + gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA + gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs + 7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H/////// + //gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO + D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae + A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA + D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H/////// + //gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA + A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae + A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac + B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH///// + //gf////////+B////8= + + + + 257, 17 + + + 397, 17 + + + 563, 19 + + + + AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB + gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs + 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 + 7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs + 7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs + 7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs + 7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA + AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA + AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA + AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs + 7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs + 7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA + gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs + 7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs + 7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA + gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs + 7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs + 7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA + gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs + 7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs + 7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs + 7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA + AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA + AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs + 7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs + 7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs + 7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA + AAAAAAAAAAAAAOzs7K3s7Oz/7Ozs/+zs7NLs7OwCAAAAAAAAAAAAAAAA7Ozsnuzs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pns7OyB7OzsDgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOzs7CTs7OwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADs7Own7Ozs4ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz77OzsKQAAAAAAAAAAAAAAAOzs7Ebs7Oz/7Ozs/+zs7P/s7Oz/7OzsaQAAAAAAAAAAAAAAAOzs + 7Bbs7Ozx7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7O/s7Ow6AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Crs7Oz07Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsjwAAAAAAAAAAAAAAAOvr6wTs7OzW7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7O3s7OwQAAAAAAAAAAAAAAAA7Ozsduzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7Pns7Ow7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ozscuzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs6+zs7A8AAAAAAAAAAAAAAADs7Oxu7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzskAAAAAAAAAAAAAAAAOzs7Afs7Ozc7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7OyCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBgQOAgIBFgICAVICAgBMAAAAAAAAAAAAA + AAAAAAAAAAAAAOzs7Ajs7Ozs7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7GUAAAAAAAAAAAAA + AADs7OwV7Ozs8Ozs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7Pvs7OwpAAAAAAAAAAAAAAAA7OzsUOzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozy7OzsDwAAAAAAAAAAAAAAAAAAAAAAAAAAgICACYCA + gDOAgIAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgBOAgIDOgICA/4CA + gP+AgIDygICAQgAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsnOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7Mzq6uoAAAAAAAAAAAAAAAAA7Ozsnezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsuAAA + AAAAAAAAAAAAAMPDwwDs7Oy/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsqAAAAAAAAAAAAAAAAAAA + AAAAAAAAgICARoCAgO6AgID/gICA/4CAgJeAgIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACAgICVgICA/4CAgP+AgID/gICA/4CAgOWAgIACAAAAAAAAAAAAAAAAAAAAAOzs7Gns7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P7s7Ow3AAAAAAAAAAAAAAAA7OzsM+zs7P7s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7OxKAAAAAAAAAAAAAAAA7OzsLezs7P3s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7G8AAAAAAAAAAAAAAAAAAAAAgICAD4CAgPKAgID/gICA/4CAgP+AgID/gICAZAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAgICAzICAgP+AgID/gICA/4CAgP+AgID/gICAJgAAAAAAAAAAAAAAAAAA + AADs7OxT7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OyjAAAAAAAAAAAAAAAA3d3dAOzs7MXs7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs2ezs7AYAAAAAAAAAAAAAAADs7OyW7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7OxjAAAAAAAAAAAAAAAAAAAAAICAgEGAgID/gICA/4CAgP+AgID/gICA/4CA + gKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgKuAgID/gICA/4CAgP+AgID/gICA9IGB + gQcAAAAAAAAAAAAAAAAAAAAA7OzsYOzs7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsGgAAAAAAAAAAAAAAAOzs + 7F3s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ox0AAAAAAAA + AAAAAAAA7OzsFezs7PHs7Oz/7Ozs/+zs7P/s7Oz/7OzsZQAAAAAAAAAAAAAAAAAAAACAgIAqgICA/4CA + gP+AgID/gICA/4CAgP+AgICMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIArgICA8YCA + gP+AgID/gICA/4CAgG8AAAAAAAAAAAAAAAAAAAAAAAAAAOzs7H/s7Oz/7Ozs/+zs7P/s7Oz/7OzsdQAA + AAAAAAAAAAAAAOzs7A3s7Ozn7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs8Ozs7BQAAAAAAAAAAAAAAADs7Oxy7Ozs/+zs7P/s7Oz/7Ozs/+zs7IIAAAAAAAAAAAAA + AAAAAAAAAAAAAICAgK2AgID/gICA/4CAgP+AgIDwgICAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAICAgB6AgICBgICAkoCAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OzG7Ozs/+zs + 7P/s7Oz/7Ozs2ezs7AYAAAAAAAAAAAAAAADs7OyK7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OyZAAAAAAAAAAAAAAAA7OzsBezs7Njs7Oz/7Ozs/+zs + 7P/s7OzHAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAFgICAb4CAgKyAgICTgICAIgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA + AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA + AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs + 7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs + 7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA + 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 + gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA + gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs + 7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H/////// + //gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO + D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae + A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA + D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H/////// + //gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA + A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae + A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac + B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH///// + //gf////////+B////8= + + \ No newline at end of file diff --git a/02_Windows_App/Perun_v1/packages.config b/02_Windows_App/Perun_v1/packages.config new file mode 100644 index 0000000..18cf35a --- /dev/null +++ b/02_Windows_App/Perun_v1/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/02_Windows_App/Perun_v1/perun_logo.ico b/02_Windows_App/Perun_v1/perun_logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..2e3ec011065507ffc28a5768d96031ba840ed6ee GIT binary patch literal 16694 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