From de4801c12381f46eb1ee5a9a17bb6a4dd90db2e7 Mon Sep 17 00:00:00 2001 From: Joshua Gutenplan Date: Sat, 18 Mar 2017 17:03:49 -0700 Subject: [PATCH] Changes for pull request: two changes to auto reconnect on TCPclient. Line 259 if not disconnect called by user. and Line 317 add AutoReconnect to the If statement. Added 3 new class files. GenericSecureTcpIpClient, GenericSecureTcpIpServer, and GenericTcpIpServer. Lastly, I updated the name of the EventArgs.cs to be generic, and added the new class event args to that file. --- Pepperdash Core/Pepperdash Core.suo | Bin 65024 -> 68608 bytes .../Pepperdash Core/Comm/DynamicTCPServer.cs | 684 ++++++++++++++++++ .../Pepperdash Core/Comm/EventArgs.cs | 49 +- .../Comm/GenericSecureTcpIpClient.cs | 371 ++++++++++ .../Comm/GenericSecureTcpIpServer.cs | 505 +++++++++++++ .../Comm/GenericTcpIpServer.cs | 505 +++++++++++++ .../Pepperdash Core/PepperDash_Core.csproj | 6 +- .../PepperDash_Core.projectinfo | Bin 1059 -> 1064 bytes .../Pepperdash Core/bin/PepperDash_Core.clz | Bin 1024645 -> 1029429 bytes .../bin/PepperDash_Core.config | 4 +- .../Pepperdash Core/bin/PepperDash_Core.dll | Bin 73400 -> 88760 bytes .../Pepperdash Core/bin/PepperDash_Core.pdb | Bin 138752 -> 167424 bytes .../Pepperdash Core/bin/manifest.info | 2 +- .../Pepperdash Core/bin/manifest.ser | Bin 820 -> 822 bytes .../obj/Debug/PepperDash_Core.dll | Bin 71680 -> 86528 bytes .../obj/Debug/PepperDash_Core.pdb | Bin 210432 -> 214528 bytes 16 files changed, 2121 insertions(+), 5 deletions(-) create mode 100644 Pepperdash Core/Pepperdash Core/Comm/DynamicTCPServer.cs create mode 100644 Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpClient.cs create mode 100644 Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpServer.cs create mode 100644 Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpServer.cs diff --git a/Pepperdash Core/Pepperdash Core.suo b/Pepperdash Core/Pepperdash Core.suo index df08759c7f7d6348a1101858fbc9475e47f459f8..fb8dbb6520256a779bb9f75433fbc41726a8104a 100644 GIT binary patch delta 3213 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 + /// Event for Receiving text + /// + public event EventHandler TextReceived; + + /// + /// Event for client connection socket status change + /// + public event EventHandler ClientConnectionChange; + + /// + /// Event for Server State Change + /// + public event EventHandler ServerStateChange; + #endregion + + #region Properties/Variables + /// + /// Secure or unsecure TCP server. Defaults to Unsecure or standard TCP server without SSL + /// + public bool Secure { get; set; } + + /// + /// S+ Helper for Secure bool. Parameter in SIMPL+ so there is no get, one way set from simpl+ Param to property in func main of SIMPL+ + /// + public ushort USecure + { + set + { + if (value == 1) + Secure = true; + else if (value == 0) + Secure = false; + } + } + + /// + /// Text representation of the Socket Status enum values for the server + /// + public string Status + { + get + { + if (Secure ? SecureServer != null : UnsecureServer != null) + return Secure ? SecureServer.State.ToString() : UnsecureServer.State.ToString(); + else + return ""; + } + + } + + /// + /// Bool showing if socket is connected + /// + public bool IsConnected + { + get + { + return (Secure ? SecureServer != null : UnsecureServer != null) && + (Secure ? SecureServer.State == ServerState.SERVER_CONNECTED : UnsecureServer.State == ServerState.SERVER_CONNECTED); + } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsConnected + { + get { return (ushort)(IsConnected ? 1 : 0); } + } + + /// + /// Bool showing if socket is connected + /// + public bool IsListening + { + get { return (Secure ? SecureServer != null : UnsecureServer != null) && + (Secure ? SecureServer.State == ServerState.SERVER_LISTENING : UnsecureServer.State == ServerState.SERVER_LISTENING); } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsListening + { + get { return (ushort)(IsListening ? 1 : 0); } + } + + public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable + /// + /// Number of clients currently connected. + /// + public ushort NumberOfClientsConnected + { + get + { + if (Secure ? SecureServer != null : UnsecureServer != null) + return Secure ? (ushort)SecureServer.NumberOfClientsConnected : (ushort)UnsecureServer.NumberOfClientsConnected; + return 0; + } + } + + /// + /// Port Server should listen on + /// + public int Port { get; set; } + + /// + /// S+ helper for Port + /// + public ushort UPort + { + get { return Convert.ToUInt16(Port); } + set { Port = Convert.ToInt32(value); } + } + + /// + /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client + /// + public bool SharedKeyRequired { get; set; } + + /// + /// S+ helper for requires shared key bool + /// + public ushort USharedKeyRequired + { + set + { + if (value == 1) + SharedKeyRequired = true; + else + SharedKeyRequired = false; + } + } + + /// + /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module. + /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called + /// + public string SharedKey { get; set; } + + /// + /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received + /// + public bool HeartbeatRequired { get; set; } + + /// + /// S+ Helper for Heartbeat Required + /// + public ushort UHeartbeatRequired + { + set + { + if (value == 1) + HeartbeatRequired = true; + else + HeartbeatRequired = false; + } + } + + /// + /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+ + /// + public int HeartbeatRequiredIntervalMs { get; set; } + + /// + /// Simpl+ Heartbeat Analog value in seconds + /// + public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } } + + /// + /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer + /// + public string HeartbeatStringToMatch { get; set; } + + //private timers for Heartbeats per client + Dictionary HeartbeatTimerDictionary = new Dictionary(); + + //flags to show the secure server is waiting for client at index to send the shared key + List WaitingForSharedKey = new List(); + + //Store the connected client indexes + List ConnectedClientsIndexes = new List(); + + /// + /// Defaults to 2000 + /// + public int BufferSize { get; set; } + + /// + /// Private flag to note that the server has stopped intentionally + /// + private bool ServerStopped { get; set; } + + //Servers + SecureTCPServer SecureServer; + TCPServer UnsecureServer; + + #endregion + + #region Constructors + /// + /// constructor + /// + public DynamicTCPServer() + : base("Uninitialized Dynamic TCP Server") + { + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + BufferSize = 2000; + Secure = false; + } + #endregion + + #region Methods - Server Actions + /// + /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+ + /// + /// + public void Initialize(string key) + { + Key = key; + } + + /// + /// Start listening on the specified port + /// + public void Listen() + { + try + { + if (Port < 1 || Port > 65535) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericSecureTcpClient '{0}': Invalid port", Key); + ErrorLog.Warn(string.Format("GenericSecureTcpClient '{0}': Invalid port", Key)); + return; + } + if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericSecureTcpClient '{0}': No Shared Key set", Key); + ErrorLog.Warn(string.Format("GenericSecureTcpClient '{0}': No Shared Key set", Key)); + return; + } + if (IsListening) + return; + if (Secure) + { + SecureServer = new SecureTCPServer(Port, MaxClients); + SecureServer.SocketStatusChange += new SecureTCPServerSocketStatusChangeEventHandler(SecureServer_SocketStatusChange); + ServerStopped = false; + SecureServer.WaitForConnectionAsync(IPAddress.Any, SecureConnectCallback); + onServerStateChange(); + Debug.Console(2, "Secure Server Status: {0}, Socket Status: {1}\r\n", SecureServer.State.ToString(), SecureServer.ServerSocketStatus); + } + else + { + UnsecureServer = new TCPServer(Port, MaxClients); + UnsecureServer.SocketStatusChange += new TCPServerSocketStatusChangeEventHandler(UnsecureServer_SocketStatusChange); + ServerStopped = false; + UnsecureServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback); + onServerStateChange(); + Debug.Console(2, "Unsecure Server Status: {0}, Socket Status: {1}\r\n", UnsecureServer.State.ToString(), UnsecureServer.ServerSocketStatus); + } + } + catch (Exception ex) + { + ErrorLog.Error("Error with Dynamic Server: {0}", ex.ToString()); + } + } + + /// + /// Stop Listeneing + /// + public void StopListening() + { + Debug.Console(2, "Stopping Listener"); + if (SecureServer != null) + SecureServer.Stop(); + if (UnsecureServer != null) + UnsecureServer.Stop(); + ServerStopped = true; + onServerStateChange(); + } + + /// + /// Disconnect All Clients + /// + public void DisconnectAllClients() + { + Debug.Console(2, "Disconnecting All Clients"); + if (SecureServer != null) + SecureServer.DisconnectAll(); + if (UnsecureServer != null) + UnsecureServer.DisconnectAll(); + onConnectionChange(); + onServerStateChange(); //State shows both listening and connected + } + + /// + /// Broadcast text from server to all connected clients + /// + /// + public void BroadcastText(string text) + { + if (ConnectedClientsIndexes.Count > 0) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + if (Secure) + foreach (uint i in ConnectedClientsIndexes) + SecureServer.SendDataAsync(i, b, b.Length, SecureSendDataAsyncCallback); + else + foreach (uint i in ConnectedClientsIndexes) + UnsecureServer.SendDataAsync(i, b, b.Length, UnsecureSendDataAsyncCallback); + } + } + + /// + /// Not sure this is useful in library, maybe Pro?? + /// + /// + /// + public void SendTextToClient(string text, uint clientIndex) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + if (Secure) + SecureServer.SendDataAsync(clientIndex, b, b.Length, SecureSendDataAsyncCallback); + else + UnsecureServer.SendDataAsync(clientIndex, b, b.Length, UnsecureSendDataAsyncCallback); + } + + //private method to check heartbeat requirements and start or reset timer + void checkHeartbeat(uint clientIndex, string received) + { + if (HeartbeatRequired) + { + if (!string.IsNullOrEmpty(HeartbeatStringToMatch)) + { + if (received == HeartbeatStringToMatch) + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + else + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + } + #endregion + + #region Methods - HeartbeatTimer Callback + + void HeartbeatTimer_CallbackFunction(object o) + { + uint clientIndex = (uint)o; + + string address = Secure ? SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex) : + UnsecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex); + + ErrorLog.Error("Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + Debug.Console(2, "Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + + SendTextToClient("Heartbeat not received by server, closing connection", clientIndex); + + if (Secure) + SecureServer.Disconnect(clientIndex); + else + UnsecureServer.Disconnect(clientIndex); + HeartbeatTimerDictionary.Remove(clientIndex); + } + + #endregion + + #region Methods - Socket Status Changed Callbacks + /// + /// Secure Server Socket Status Changed Callback + /// + /// + /// + /// + void SecureServer_SocketStatusChange(SecureTCPServer server, uint clientIndex, SocketStatus serverSocketStatus) + { + Debug.Console(2, "Client at {0} ServerSocketStatus {1}", + server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString()); + if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + { + if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex)) + WaitingForSharedKey.Add(clientIndex); + if (!ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Add(clientIndex); + } + else + { + if (ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Remove(clientIndex); + if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary.Remove(clientIndex); + } + if(SecureServer.ServerSocketStatus.ToString() != Status) + onConnectionChange(); + } + + /// + /// TCP Server (Unsecure) Socket Status Change Callback + /// + /// + /// + /// + void UnsecureServer_SocketStatusChange(TCPServer server, uint clientIndex, SocketStatus serverSocketStatus) + { + Debug.Console(2, "Client at {0} ServerSocketStatus {1}", + server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString()); + if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + { + if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex)) + WaitingForSharedKey.Add(clientIndex); + if (!ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Add(clientIndex); + } + else + { + if (ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Remove(clientIndex); + if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary.Remove(clientIndex); + } + if (UnsecureServer.ServerSocketStatus.ToString() != Status) + onConnectionChange(); + } + #endregion + + #region Methods Connected Callbacks + /// + /// Secure TCP Client Connected to Secure Server Callback + /// + /// + /// + void SecureConnectCallback(SecureTCPServer mySecureTCPServer, uint clientIndex) + { + if (mySecureTCPServer.ClientConnected(clientIndex)) + { + if (SharedKeyRequired) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n"); + mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, SecureSendDataAsyncCallback); + Debug.Console(2, "Sent Shared Key to client at {0}", mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex)); + } + if (HeartbeatRequired) + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback); + if (mySecureTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + mySecureTCPServer.WaitForConnectionAsync(IPAddress.Any, SecureConnectCallback); + } + } + + /// + /// Unsecure TCP Client Connected to Unsecure Server Callback + /// + /// + /// + void UnsecureConnectCallback(TCPServer myTCPServer, uint clientIndex) + { + if (myTCPServer.ClientConnected(clientIndex)) + { + if (SharedKeyRequired) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n"); + myTCPServer.SendDataAsync(clientIndex, b, b.Length, UnsecureSendDataAsyncCallback); + Debug.Console(2, "Sent Shared Key to client at {0}", myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex)); + } + if (HeartbeatRequired) + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + myTCPServer.ReceiveDataAsync(clientIndex, UnsecureReceivedDataAsyncCallback); + if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + myTCPServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback); + } + if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + myTCPServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback); + } + #endregion + + #region Methods - Send/Receive Callbacks + /// + /// Secure Send Data Async Callback + /// + /// + /// + /// + void SecureSendDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesSent) + { + //Seems there is nothing to do here + } + + /// + /// Unsecure Send Data Asyc Callback + /// + /// + /// + /// + void UnsecureSendDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesSent) + { + //Seems there is nothing to do here + } + + /// + /// Secure Received Data Async Callback + /// + /// + /// + /// + void SecureReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesReceived) + { + if (numberOfBytesReceived > 0) + { + string received = "Nothing"; + byte[] bytes = mySecureTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex); + received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived); + if (WaitingForSharedKey.Contains(clientIndex)) + { + received = received.Replace("\r", ""); + received = received.Replace("\n", ""); + if (received != SharedKey) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting"); + Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, null); + mySecureTCPServer.Disconnect(clientIndex); + } + if (mySecureTCPServer.NumberOfClientsConnected > 0) + mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback); + WaitingForSharedKey.Remove(clientIndex); + byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication"); + mySecureTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null); + mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback); + } + else + { + mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback); + Debug.Console(2, "Secure Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n", + mySecureTCPServer.PortNumber, mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received); + onTextReceived(received); + } + checkHeartbeat(clientIndex, received); + } + if (mySecureTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback); + } + + /// + /// Unsecure Received Data Async Callback + /// + /// + /// + /// + void UnsecureReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesReceived) + { + if (numberOfBytesReceived > 0) + { + string received = "Nothing"; + byte[] bytes = myTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex); + received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived); + if (WaitingForSharedKey.Contains(clientIndex)) + { + received = received.Replace("\r", ""); + received = received.Replace("\n", ""); + if (received != SharedKey) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting"); + Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + myTCPServer.SendDataAsync(clientIndex, b, b.Length, null); + myTCPServer.Disconnect(clientIndex); + } + if (myTCPServer.NumberOfClientsConnected > 0) + myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback); + WaitingForSharedKey.Remove(clientIndex); + byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication"); + myTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null); + myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback); + } + else + { + myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback); + Debug.Console(2, "Secure Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n", + myTCPServer.PortNumber, myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received); + onTextReceived(received); + } + checkHeartbeat(clientIndex, received); + } + if (myTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + myTCPServer.ReceiveDataAsync(clientIndex, UnsecureReceivedDataAsyncCallback); + } + #endregion + + #region Methods - EventHelpers/Callbacks + //Private Helper method to call the Connection Change Event + void onConnectionChange() + { + var handler = ClientConnectionChange; + if (handler != null) + { + if (Secure) + handler(this, new DynamicTCPSocketStatusChangeEventArgs(SecureServer, Secure)); + else + handler(this, new DynamicTCPSocketStatusChangeEventArgs(UnsecureServer, Secure)); + } + } + + //Private Helper Method to call the Text Received Event + void onTextReceived(string text) + { + var handler = TextReceived; + if (handler != null) + handler(this, new CopyCoreForSimplpGenericCommMethodReceiveTextArgs(text)); + } + + //Private Helper Method to call the Server State Change Event + void onServerStateChange() + { + var handler = ServerStateChange; + if(handler != null) + { + if(Secure) + handler(this, new DynamicTCPServerStateChangedEventArgs(SecureServer, Secure)); + else + handler(this, new DynamicTCPServerStateChangedEventArgs(UnsecureServer, Secure)); + } + } + + //Private Event Handler method to handle the closing of connections when the program stops + void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) + { + if (programEventType == eProgramStatusEventType.Stopping) + { + Debug.Console(1, this, "Program stopping. Closing server"); + DisconnectAllClients(); + StopListening(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/Comm/EventArgs.cs b/Pepperdash Core/Pepperdash Core/Comm/EventArgs.cs index cc7afe4..3732e0d 100644 --- a/Pepperdash Core/Pepperdash Core/Comm/EventArgs.cs +++ b/Pepperdash Core/Pepperdash Core/Comm/EventArgs.cs @@ -1,4 +1,14 @@ -using System; +/*PepperDash Technology Corp. +Copyright: 2017 +------------------------------------ +***Notice of Ownership and Copyright*** +The material in which this notice appears is the property of PepperDash Technology Corporation, +which claims copyright under the laws of the United States of America in the entire body of material +and in all parts thereof, regardless of the use to which it is being put. Any use, in whole or in part, +of this material by another party without the express written permission of PepperDash Technology Corporation is prohibited. +PepperDash Technology Corporation reserves all rights under applicable laws. +------------------------------------ */ +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -24,6 +34,43 @@ namespace PepperDash.Core } #endregion + #region DynamicTCPServerStateChangedEventArgs + public delegate void DynamicTCPServerStateChangedEventDelegate(object server); + + public class DynamicTCPServerStateChangedEventArgs : EventArgs + { + public bool Secure { get; private set; } + public object Server { get; private set; } + + public DynamicTCPServerStateChangedEventArgs() { } + + public DynamicTCPServerStateChangedEventArgs(object server, bool secure) + { + Secure = secure; + Server = server; + } + } + #endregion + + #region DynamicTCPSocketStatusChangeEventDelegate + public delegate void DynamicTCPSocketStatusChangeEventDelegate(object server); + + public class DynamicTCPSocketStatusChangeEventArgs : EventArgs + { + public bool Secure { get; private set; } + public object Server { get; private set; } + + public DynamicTCPSocketStatusChangeEventArgs() { } + + public DynamicTCPSocketStatusChangeEventArgs(object server, bool secure) + { + Secure = secure; + Server = server; + } + } + #endregion + + } \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpClient.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpClient.cs new file mode 100644 index 0000000..82305ad --- /dev/null +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpClient.cs @@ -0,0 +1,371 @@ +/*PepperDash Technology Corp. +JAG +Copyright: 2017 +------------------------------------ +***Notice of Ownership and Copyright*** +The material in which this notice appears is the property of PepperDash Technology Corporation, +which claims copyright under the laws of the United States of America in the entire body of material +and in all parts thereof, regardless of the use to which it is being put. Any use, in whole or in part, +of this material by another party without the express written permission of PepperDash Technology Corporation is prohibited. +PepperDash Technology Corporation reserves all rights under applicable laws. +------------------------------------ */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronSockets; + +namespace PepperDash.Core +{ + public class GenericSecureTcpIpClient : Device, ISocketStatus, IAutoReconnect + { + #region Events + + public event EventHandler BytesReceived; + + public event EventHandler TextReceived; + + public event EventHandler ConnectionChange; + + #endregion + + #region Properties & Variables + /// + /// Address of server + /// + public string Hostname { get; set; } + + /// + /// Port on server + /// + public int Port { get; set; } + + /// + /// S+ helper + /// + public ushort UPort + { + get { return Convert.ToUInt16(Port); } + set { Port = Convert.ToInt32(value); } + } + + /// + /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class + /// + public bool SharedKeyRequired { get; set; } + + /// + /// S+ helper for requires shared key bool + /// + public ushort USharedKeyRequired + { + set + { + if (value == 1) + SharedKeyRequired = true; + else + SharedKeyRequired = false; + } + } + + /// + /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module + /// + public string SharedKey { get; set; } + + /// + /// flag to show the client is waiting for the server to send the shared key + /// + private bool WaitingForSharedKeyResponse { get; set; } + + /// + /// Defaults to 2000 + /// + public int BufferSize { get; set; } + + /// + /// Bool showing if socket is connected + /// + public bool IsConnected + { + get + { + return (Client != null) && (Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED); + } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsConnected + { + get { return (ushort)(IsConnected ? 1 : 0); } + } + + /// + /// Client socket status Read only + /// + public SocketStatus ClientStatus + { + get + { + if (Client == null) + return SocketStatus.SOCKET_STATUS_NO_CONNECT; + return Client.ClientStatus; + } + } + + /// + /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event + /// and IsConnected would be true when this == 2. + /// + public ushort UStatus + { + get { return (ushort)ClientStatus; } + } + + /// + /// Status text shows the message associated with socket status + /// + public string ClientStatusText { get { return ClientStatus.ToString(); } } + + /// + /// bool to track if auto reconnect should be set on the socket + /// + public bool AutoReconnect { get; set; } + + /// + /// S+ helper for AutoReconnect + /// + public ushort UAutoReconnect + { + get { return (ushort)(AutoReconnect ? 1 : 0); } + set { AutoReconnect = value == 1; } + } + /// + /// Milliseconds to wait before attempting to reconnect. Defaults to 5000 + /// + public int AutoReconnectIntervalMs { get; set; } + + /// + /// Flag Set only when the disconnect method is called. + /// + bool DisconnectCalledByUser; + + /// + /// Connected bool + /// + public bool Connected + { + get { return (Client != null) && (Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED); } + } + + CTimer RetryTimer; //private Timer for auto reconnect + + SecureTCPClient Client; //Secure Client Class + + #endregion + + #region Constructors + + //Base class constructor + public GenericSecureTcpIpClient(string key, string address, int port, int bufferSize) + : base(key) + { + Hostname = address; + Port = port; + BufferSize = bufferSize; + AutoReconnectIntervalMs = 5000; + } + + //base class constructor + public GenericSecureTcpIpClient() + : base("Uninitialized DynamicTcpClient") + { + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + AutoReconnectIntervalMs = 5000; + BufferSize = 2000; + } + #endregion + + #region Methods + /// + /// Just to help S+ set the key + /// + public void Initialize(string key) + { + Key = key; + } + + /// + /// Handles closing this up when the program shuts down + /// + void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) + { + if (programEventType == eProgramStatusEventType.Stopping) + { + if (Client != null) + { + Debug.Console(1, this, "Program stopping. Closing connection"); + Client.DisconnectFromServer(); + Client.Dispose(); + } + } + } + + /// + /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name. + /// + public void Connect() + { + if (IsConnected) + return; + + if (string.IsNullOrEmpty(Hostname)) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "DynamicTcpClient '{0}': No address set", Key); + ErrorLog.Warn(string.Format("DynamicTcpClient '{0}': No address set", Key)); + return; + } + if (Port < 1 || Port > 65535) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "DynamicTcpClient '{0}': Invalid port", Key); + ErrorLog.Warn(string.Format("DynamicTcpClient '{0}': Invalid port", Key)); + return; + } + if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "DynamicTcpClient '{0}': No Shared Key set", Key); + ErrorLog.Warn(string.Format("DynamicTcpClient '{0}': No Shared Key set", Key)); + return; + } + Client = new SecureTCPClient(Hostname, Port, BufferSize); + Client.SocketStatusChange += SecureClient_SocketStatusChange; + DisconnectCalledByUser = false; + if (SharedKeyRequired) + WaitingForSharedKeyResponse = true; + Client.ConnectToServer(); + } + + /// + /// Disconnect client. Does not dispose. + /// + public void Disconnect() + { + DisconnectCalledByUser = true; + if(Client != null) + Client.DisconnectFromServer(); + } + + /// + /// callback after connection made + /// + /// + void ConnectToServerCallback(object o) + { + Client.ConnectToServer(); + if (Client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED) + WaitAndTryReconnect(); + } + + /// + /// Called from Socket Status change if auto reconnect and socket disconnected (Not disconnected by user) + /// + void WaitAndTryReconnect() + { + Client.DisconnectFromServer(); + Debug.Console(2, "Attempting reconnect, status={0}", Client.ClientStatus); + + if (!DisconnectCalledByUser) + RetryTimer = new CTimer(ConnectToServerCallback, AutoReconnectIntervalMs); + } + + /// + /// Receive callback + /// + /// + /// + void SecureReceive(SecureTCPClient client, int numBytes) + { + if (numBytes > 0) + { + var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray(); + var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length); + if (WaitingForSharedKeyResponse && SharedKeyRequired) + { + if (str != (SharedKey + "\n")) + { + WaitingForSharedKeyResponse = false; + client.DisconnectFromServer(); + CrestronConsole.PrintLine("Client {0} was disconnected from server because the server did not respond with a matching shared key after connection", Key); + ErrorLog.Error("Client {0} was disconnected from server because the server did not respond with a matching shared key after connection", Key); + return; + } + else + { + WaitingForSharedKeyResponse = false; + CrestronConsole.PrintLine("Client {0} successfully connected to the server and received the Shared Key. Ready for communication", Key); + } + } + else + { + var bytesHandler = BytesReceived; + if (bytesHandler != null) + bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes)); + var textHandler = TextReceived; + if (textHandler != null) + { + + textHandler(this, new GenericCommMethodReceiveTextArgs(str)); + } + } + } + client.ReceiveDataAsync(SecureReceive); + } + + /// + /// General send method + /// + public void SendText(string text) + { + var bytes = Encoding.GetEncoding(28591).GetBytes(text); + Client.SendData(bytes, bytes.Length); + } + + public void SendBytes(byte[] bytes) + { + Client.SendData(bytes, bytes.Length); + } + + /// + /// SocketStatusChange Callback + /// + /// + /// + void SecureClient_SocketStatusChange(SecureTCPClient client, SocketStatus clientSocketStatus) + { + Debug.Console(2, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText); + if (client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED && !DisconnectCalledByUser && AutoReconnect) + WaitAndTryReconnect(); + + // Probably doesn't need to be a switch since all other cases were eliminated + switch (clientSocketStatus) + { + case SocketStatus.SOCKET_STATUS_CONNECTED: + client.ReceiveDataAsync(SecureReceive); + if(SharedKeyRequired) + SendText(SharedKey + "\n"); + DisconnectCalledByUser = false; + break; + } + + var handler = ConnectionChange; + if (handler != null) + ConnectionChange(this, new GenericSocketStatusChageEventArgs(this)); + } + #endregion + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpServer.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpServer.cs new file mode 100644 index 0000000..365cbcb --- /dev/null +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericSecureTcpIpServer.cs @@ -0,0 +1,505 @@ +/*PepperDash Technology Corp. +JAG +Copyright: 2017 +------------------------------------ +***Notice of Ownership and Copyright*** +The material in which this notice appears is the property of PepperDash Technology Corporation, +which claims copyright under the laws of the United States of America in the entire body of material +and in all parts thereof, regardless of the use to which it is being put. Any use, in whole or in part, +of this material by another party without the express written permission of PepperDash Technology Corporation is prohibited. +PepperDash Technology Corporation reserves all rights under applicable laws. +------------------------------------ */ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronSockets; + +namespace PepperDash.Core +{ + public class GenericSecureTcpIpServer : Device + { + #region Events + /// + /// Event for Receiving text + /// + public event EventHandler TextReceived; + + /// + /// Event for client connection socket status change + /// + public event EventHandler ClientConnectionChange; + + /// + /// Event for Server State Change + /// + public event EventHandler ServerStateChange; + #endregion + + #region Properties/Variables + /// + /// Text representation of the Socket Status enum values for the server + /// + public string Status + { + get + { + if (Server != null) + return Server.State.ToString(); + else + return ServerState.SERVER_NOT_LISTENING.ToString(); + } + + } + + /// + /// Bool showing if socket is connected + /// + public bool IsConnected + { + get { return (Server != null) && (Server.State == ServerState.SERVER_CONNECTED); } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsConnected + { + get { return (ushort)(IsConnected ? 1 : 0); } + } + + /// + /// Bool showing if socket is connected + /// + public bool IsListening + { + get { return (Server != null) && (Server.State == ServerState.SERVER_LISTENING); } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsListening + { + get { return (ushort)(IsListening ? 1 : 0); } + } + + public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable + /// + /// Number of clients currently connected. + /// + public ushort NumberOfClientsConnected + { + get + { + if (Server != null) + return (ushort)Server.NumberOfClientsConnected; + return 0; + } + } + + /// + /// Port Server should listen on + /// + public int Port { get; set; } + + /// + /// S+ helper for Port + /// + public ushort UPort + { + get { return Convert.ToUInt16(Port); } + set { Port = Convert.ToInt32(value); } + } + + /// + /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client + /// + public bool SharedKeyRequired { get; set; } + + /// + /// S+ helper for requires shared key bool + /// + public ushort USharedKeyRequired + { + set + { + if (value == 1) + SharedKeyRequired = true; + else + SharedKeyRequired = false; + } + } + + /// + /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module. + /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called + /// + public string SharedKey { get; set; } + + /// + /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received + /// + public bool HeartbeatRequired { get; set; } + + /// + /// S+ Helper for Heartbeat Required + /// + public ushort UHeartbeatRequired + { + set + { + if (value == 1) + HeartbeatRequired = true; + else + HeartbeatRequired = false; + } + } + + /// + /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+ + /// + public int HeartbeatRequiredIntervalMs { get; set; } + + /// + /// Simpl+ Heartbeat Analog value in seconds + /// + public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } } + + /// + /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer + /// + public string HeartbeatStringToMatch { get; set; } + + //private timers for Heartbeats per client + Dictionary HeartbeatTimerDictionary = new Dictionary(); + + //flags to show the server is waiting for client at index to send the shared key + List WaitingForSharedKey = new List(); + + //Store the connected client indexes + List ConnectedClientsIndexes = new List(); + + /// + /// Defaults to 2000 + /// + public int BufferSize { get; set; } + + /// + /// Private flag to note that the server has stopped intentionally + /// + private bool ServerStopped { get; set; } + + //Servers + SecureTCPServer Server; + + #endregion + + #region Constructors + /// + /// constructor + /// + public GenericSecureTcpIpServer() + : base("Uninitialized Dynamic TCP Server") + { + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + BufferSize = 2000; + } + #endregion + + #region Methods - Server Actions + /// + /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+ + /// + /// + public void Initialize(string key) + { + Key = key; + } + + /// + /// Start listening on the specified port + /// + public void Listen() + { + try + { + if (Port < 1 || Port > 65535) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "Server '{0}': Invalid port", Key); + ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key)); + return; + } + if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "Server '{0}': No Shared Key set", Key); + ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key)); + return; + } + if (IsListening) + return; + Server = new SecureTCPServer(Port, MaxClients); + Server.SocketStatusChange += new SecureTCPServerSocketStatusChangeEventHandler(SocketStatusChange); + ServerStopped = false; + Server.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + onServerStateChange(); + Debug.Console(2, "Server Status: {0}, Socket Status: {1}\r\n", Server.State.ToString(), Server.ServerSocketStatus); + } + catch (Exception ex) + { + ErrorLog.Error("Error with Dynamic Server: {0}", ex.ToString()); + } + } + + /// + /// Stop Listeneing + /// + public void StopListening() + { + Debug.Console(2, "Stopping Listener"); + if (Server != null) + Server.Stop(); + ServerStopped = true; + onServerStateChange(); + } + + /// + /// Disconnect All Clients + /// + public void DisconnectAllClients() + { + Debug.Console(2, "Disconnecting All Clients"); + if (Server != null) + Server.DisconnectAll(); + onConnectionChange(); + onServerStateChange(); //State shows both listening and connected + } + + /// + /// Broadcast text from server to all connected clients + /// + /// + public void BroadcastText(string text) + { + if (ConnectedClientsIndexes.Count > 0) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + foreach (uint i in ConnectedClientsIndexes) + Server.SendDataAsync(i, b, b.Length, SendDataAsyncCallback); + } + } + + /// + /// Not sure this is useful in library, maybe Pro?? + /// + /// + /// + public void SendTextToClient(string text, uint clientIndex) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + Server.SendDataAsync(clientIndex, b, b.Length, SendDataAsyncCallback); + } + + //private method to check heartbeat requirements and start or reset timer + void checkHeartbeat(uint clientIndex, string received) + { + if (HeartbeatRequired) + { + if (!string.IsNullOrEmpty(HeartbeatStringToMatch)) + { + if (received == HeartbeatStringToMatch) + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + else + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + } + #endregion + + #region Methods - Callbacks + /// + /// Callback to disconnect if heartbeat timer finishes without being reset + /// + /// + void HeartbeatTimer_CallbackFunction(object o) + { + uint clientIndex = (uint)o; + + string address = Server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex); + + ErrorLog.Error("Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + Debug.Console(2, "Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + + SendTextToClient("Heartbeat not received by server, closing connection", clientIndex); + Server.Disconnect(clientIndex); + HeartbeatTimerDictionary.Remove(clientIndex); + } + + /// + /// TCP Server Socket Status Change Callback + /// + /// + /// + /// + void SocketStatusChange(SecureTCPServer server, uint clientIndex, SocketStatus serverSocketStatus) + { + Debug.Console(2, "Client at {0} ServerSocketStatus {1}", + server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString()); + if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + { + if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex)) + WaitingForSharedKey.Add(clientIndex); + if (!ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Add(clientIndex); + } + else + { + if (ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Remove(clientIndex); + if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary.Remove(clientIndex); + } + if (Server.ServerSocketStatus.ToString() != Status) + onConnectionChange(); + } + + /// + /// TCP Client Connected to Server Callback + /// + /// + /// + void ConnectCallback(SecureTCPServer mySecureTCPServer, uint clientIndex) + { + if (mySecureTCPServer.ClientConnected(clientIndex)) + { + if (SharedKeyRequired) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n"); + mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, SendDataAsyncCallback); + Debug.Console(2, "Sent Shared Key to client at {0}", mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex)); + } + if (HeartbeatRequired) + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + mySecureTCPServer.ReceiveDataAsync(clientIndex, ReceivedDataAsyncCallback); + if (mySecureTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + mySecureTCPServer.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + } + if (mySecureTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + mySecureTCPServer.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + } + + /// + /// Send Data Asyc Callback + /// + /// + /// + /// + void SendDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesSent) + { + //Seems there is nothing to do here + } + + /// + /// Received Data Async Callback + /// + /// + /// + /// + void ReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesReceived) + { + if (numberOfBytesReceived > 0) + { + string received = "Nothing"; + byte[] bytes = mySecureTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex); + received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived); + if (WaitingForSharedKey.Contains(clientIndex)) + { + received = received.Replace("\r", ""); + received = received.Replace("\n", ""); + if (received != SharedKey) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting"); + Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, null); + mySecureTCPServer.Disconnect(clientIndex); + } + if (mySecureTCPServer.NumberOfClientsConnected > 0) + mySecureTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + WaitingForSharedKey.Remove(clientIndex); + byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication"); + mySecureTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null); + mySecureTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + } + else + { + mySecureTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + Debug.Console(2, "Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n", + mySecureTCPServer.PortNumber, mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received); + onTextReceived(received); + } + checkHeartbeat(clientIndex, received); + } + if (mySecureTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + mySecureTCPServer.ReceiveDataAsync(clientIndex, ReceivedDataAsyncCallback); + } + #endregion + + #region Methods - EventHelpers/Callbacks + //Private Helper method to call the Connection Change Event + void onConnectionChange() + { + var handler = ClientConnectionChange; + if (handler != null) + handler(this, new DynamicTCPSocketStatusChangeEventArgs(Server, false)); + } + + //Private Helper Method to call the Text Received Event + void onTextReceived(string text) + { + var handler = TextReceived; + if (handler != null) + handler(this, new GenericCommMethodReceiveTextArgs(text)); + } + + //Private Helper Method to call the Server State Change Event + void onServerStateChange() + { + var handler = ServerStateChange; + if (handler != null) + handler(this, new DynamicTCPServerStateChangedEventArgs(Server, false)); + } + + //Private Event Handler method to handle the closing of connections when the program stops + void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) + { + if (programEventType == eProgramStatusEventType.Stopping) + { + Debug.Console(1, this, "Program stopping. Closing server"); + DisconnectAllClients(); + StopListening(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpServer.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpServer.cs new file mode 100644 index 0000000..5b96684 --- /dev/null +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpServer.cs @@ -0,0 +1,505 @@ +/*PepperDash Technology Corp. +JAG +Copyright: 2017 +------------------------------------ +***Notice of Ownership and Copyright*** +The material in which this notice appears is the property of PepperDash Technology Corporation, +which claims copyright under the laws of the United States of America in the entire body of material +and in all parts thereof, regardless of the use to which it is being put. Any use, in whole or in part, +of this material by another party without the express written permission of PepperDash Technology Corporation is prohibited. +PepperDash Technology Corporation reserves all rights under applicable laws. +------------------------------------ */ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronSockets; + +namespace PepperDash.Core +{ + public class GenericTcpIpServer : Device + { + #region Events + /// + /// Event for Receiving text + /// + public event EventHandler TextReceived; + + /// + /// Event for client connection socket status change + /// + public event EventHandler ClientConnectionChange; + + /// + /// Event for Server State Change + /// + public event EventHandler ServerStateChange; + #endregion + + #region Properties/Variables + /// + /// Text representation of the Socket Status enum values for the server + /// + public string Status + { + get + { + if (Server != null) + return Server.State.ToString(); + else + return ServerState.SERVER_NOT_LISTENING.ToString(); + } + + } + + /// + /// Bool showing if socket is connected + /// + public bool IsConnected + { + get { return (Server != null) && (Server.State == ServerState.SERVER_CONNECTED); } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsConnected + { + get { return (ushort)(IsConnected ? 1 : 0); } + } + + /// + /// Bool showing if socket is connected + /// + public bool IsListening + { + get { return (Server != null) && (Server.State == ServerState.SERVER_LISTENING); } + } + + /// + /// S+ helper for IsConnected + /// + public ushort UIsListening + { + get { return (ushort)(IsListening ? 1 : 0); } + } + + public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable + /// + /// Number of clients currently connected. + /// + public ushort NumberOfClientsConnected + { + get + { + if (Server != null) + return (ushort)Server.NumberOfClientsConnected; + return 0; + } + } + + /// + /// Port Server should listen on + /// + public int Port { get; set; } + + /// + /// S+ helper for Port + /// + public ushort UPort + { + get { return Convert.ToUInt16(Port); } + set { Port = Convert.ToInt32(value); } + } + + /// + /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client + /// + public bool SharedKeyRequired { get; set; } + + /// + /// S+ helper for requires shared key bool + /// + public ushort USharedKeyRequired + { + set + { + if (value == 1) + SharedKeyRequired = true; + else + SharedKeyRequired = false; + } + } + + /// + /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module. + /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called + /// + public string SharedKey { get; set; } + + /// + /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received + /// + public bool HeartbeatRequired { get; set; } + + /// + /// S+ Helper for Heartbeat Required + /// + public ushort UHeartbeatRequired + { + set + { + if (value == 1) + HeartbeatRequired = true; + else + HeartbeatRequired = false; + } + } + + /// + /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+ + /// + public int HeartbeatRequiredIntervalMs { get; set; } + + /// + /// Simpl+ Heartbeat Analog value in seconds + /// + public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } } + + /// + /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer + /// + public string HeartbeatStringToMatch { get; set; } + + //private timers for Heartbeats per client + Dictionary HeartbeatTimerDictionary = new Dictionary(); + + //flags to show the server is waiting for client at index to send the shared key + List WaitingForSharedKey = new List(); + + //Store the connected client indexes + List ConnectedClientsIndexes = new List(); + + /// + /// Defaults to 2000 + /// + public int BufferSize { get; set; } + + /// + /// Private flag to note that the server has stopped intentionally + /// + private bool ServerStopped { get; set; } + + //Servers + TCPServer Server; + + #endregion + + #region Constructors + /// + /// constructor + /// + public GenericTcpIpServer() + : base("Uninitialized Dynamic TCP Server") + { + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + BufferSize = 2000; + } + #endregion + + #region Methods - Server Actions + /// + /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+ + /// + /// + public void Initialize(string key) + { + Key = key; + } + + /// + /// Start listening on the specified port + /// + public void Listen() + { + try + { + if (Port < 1 || Port > 65535) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "Server '{0}': Invalid port", Key); + ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key)); + return; + } + if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "Server '{0}': No Shared Key set", Key); + ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key)); + return; + } + if (IsListening) + return; + Server = new TCPServer(Port, MaxClients); + Server.SocketStatusChange += new TCPServerSocketStatusChangeEventHandler(SocketStatusChange); + ServerStopped = false; + Server.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + onServerStateChange(); + Debug.Console(2, "Server Status: {0}, Socket Status: {1}\r\n", Server.State.ToString(), Server.ServerSocketStatus); + } + catch (Exception ex) + { + ErrorLog.Error("Error with Dynamic Server: {0}", ex.ToString()); + } + } + + /// + /// Stop Listeneing + /// + public void StopListening() + { + Debug.Console(2, "Stopping Listener"); + if (Server != null) + Server.Stop(); + ServerStopped = true; + onServerStateChange(); + } + + /// + /// Disconnect All Clients + /// + public void DisconnectAllClients() + { + Debug.Console(2, "Disconnecting All Clients"); + if (Server != null) + Server.DisconnectAll(); + onConnectionChange(); + onServerStateChange(); //State shows both listening and connected + } + + /// + /// Broadcast text from server to all connected clients + /// + /// + public void BroadcastText(string text) + { + if (ConnectedClientsIndexes.Count > 0) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + foreach (uint i in ConnectedClientsIndexes) + Server.SendDataAsync(i, b, b.Length, SendDataAsyncCallback); + } + } + + /// + /// Not sure this is useful in library, maybe Pro?? + /// + /// + /// + public void SendTextToClient(string text, uint clientIndex) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(text); + Server.SendDataAsync(clientIndex, b, b.Length, SendDataAsyncCallback); + } + + //private method to check heartbeat requirements and start or reset timer + void checkHeartbeat(uint clientIndex, string received) + { + if (HeartbeatRequired) + { + if (!string.IsNullOrEmpty(HeartbeatStringToMatch)) + { + if (received == HeartbeatStringToMatch) + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + else + { + if (HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs); + else + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + } + } + } + #endregion + + #region Methods - Callbacks + /// + /// Callback to disconnect if heartbeat timer finishes without being reset + /// + /// + void HeartbeatTimer_CallbackFunction(object o) + { + uint clientIndex = (uint)o; + + string address = Server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex); + + ErrorLog.Error("Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + Debug.Console(2, "Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address); + + SendTextToClient("Heartbeat not received by server, closing connection", clientIndex); + Server.Disconnect(clientIndex); + HeartbeatTimerDictionary.Remove(clientIndex); + } + + /// + /// TCP Server Socket Status Change Callback + /// + /// + /// + /// + void SocketStatusChange(TCPServer server, uint clientIndex, SocketStatus serverSocketStatus) + { + Debug.Console(2, "Client at {0} ServerSocketStatus {1}", + server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString()); + if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + { + if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex)) + WaitingForSharedKey.Add(clientIndex); + if (!ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Add(clientIndex); + } + else + { + if (ConnectedClientsIndexes.Contains(clientIndex)) + ConnectedClientsIndexes.Remove(clientIndex); + if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex)) + HeartbeatTimerDictionary.Remove(clientIndex); + } + if (Server.ServerSocketStatus.ToString() != Status) + onConnectionChange(); + } + + /// + /// TCP Client Connected to Server Callback + /// + /// + /// + void ConnectCallback(TCPServer myTCPServer, uint clientIndex) + { + if (myTCPServer.ClientConnected(clientIndex)) + { + if (SharedKeyRequired) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n"); + myTCPServer.SendDataAsync(clientIndex, b, b.Length, SendDataAsyncCallback); + Debug.Console(2, "Sent Shared Key to client at {0}", myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex)); + } + if (HeartbeatRequired) + { + CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs); + HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer); + } + myTCPServer.ReceiveDataAsync(clientIndex, ReceivedDataAsyncCallback); + if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + myTCPServer.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + } + if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped) + myTCPServer.WaitForConnectionAsync(IPAddress.Any, ConnectCallback); + } + + /// + /// Send Data Asyc Callback + /// + /// + /// + /// + void SendDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesSent) + { + //Seems there is nothing to do here + } + + /// + /// Received Data Async Callback + /// + /// + /// + /// + void ReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesReceived) + { + if (numberOfBytesReceived > 0) + { + string received = "Nothing"; + byte[] bytes = myTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex); + received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived); + if (WaitingForSharedKey.Contains(clientIndex)) + { + received = received.Replace("\r", ""); + received = received.Replace("\n", ""); + if (received != SharedKey) + { + byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting"); + Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex); + myTCPServer.SendDataAsync(clientIndex, b, b.Length, null); + myTCPServer.Disconnect(clientIndex); + } + if (myTCPServer.NumberOfClientsConnected > 0) + myTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + WaitingForSharedKey.Remove(clientIndex); + byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication"); + myTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null); + myTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + } + else + { + myTCPServer.ReceiveDataAsync(ReceivedDataAsyncCallback); + Debug.Console(2, "Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n", + myTCPServer.PortNumber, myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received); + onTextReceived(received); + } + checkHeartbeat(clientIndex, received); + } + if (myTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED) + myTCPServer.ReceiveDataAsync(clientIndex, ReceivedDataAsyncCallback); + } + #endregion + + #region Methods - EventHelpers/Callbacks + //Private Helper method to call the Connection Change Event + void onConnectionChange() + { + var handler = ClientConnectionChange; + if (handler != null) + handler(this, new DynamicTCPSocketStatusChangeEventArgs(Server, false)); + } + + //Private Helper Method to call the Text Received Event + void onTextReceived(string text) + { + var handler = TextReceived; + if (handler != null) + handler(this, new GenericCommMethodReceiveTextArgs(text)); + } + + //Private Helper Method to call the Server State Change Event + void onServerStateChange() + { + var handler = ServerStateChange; + if (handler != null) + handler(this, new DynamicTCPServerStateChangedEventArgs(Server, false)); + } + + //Private Event Handler method to handle the closing of connections when the program stops + void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) + { + if (programEventType == eProgramStatusEventType.Stopping) + { + Debug.Console(1, this, "Program stopping. Closing server"); + DisconnectAllClients(); + StopListening(); + } + } + #endregion + } +} \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj index 8d0a646..4506190 100644 --- a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj +++ b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj @@ -64,10 +64,13 @@ + + + Code + - @@ -76,6 +79,7 @@ + diff --git a/Pepperdash Core/Pepperdash Core/PepperDash_Core.projectinfo b/Pepperdash Core/Pepperdash Core/PepperDash_Core.projectinfo index 700ed773384edb196c0c41677515edf2a5fd0fe6..2060a7fabbaaa6545539f428ddcd539b0a736098 100644 GIT binary patch delta 717 zcmV;;0y6!h2&f2NB19&_wVi8+uwP(y@L;t$Uy<)lL`SNe?#rp*G-!*UI-?A z0u#m;b+$O0y~!>%HCW`e%)#+&RK0B!vD;nK4)TY)dj}7*Jm0-H1rjn3gV-w}<6l0nrdj#3Lh1qjlPdy>e}+A$`;-0I{`CIt z!^x-j?`P)^iG4rKXVYwN_UWgShd%Xh4?LKOTXeBuCT`#9|BGhj!O*OHJ1+_Fz+7bc z?7?0>*~xbw-oO7ayLW#7(+4{Tll;M_`}_B2(^-5j;vj<=xCP)_%|N`X{}<8yV2JLX zJa^cC=i&7J?B33de`qwDogX~BKfU*9Hl1L6JG1+7lJ}r>`29whx1x5hm;V>nIV_Tm&D1{*5Q9_0QEe4tktLF1Qv|Cjs{c5RFEVw!=?X*}z)mErwAygUlrybb^W*wCNw delta 712 zcmV;(0yq7r2%`v)g+pS0o6>hL^VKS^pJvVc_dluXoLbJJpXT%_{WzB&7xZIqXZOMO z&b{s32XA(F9_<}G+TR=R-G6xS@czT?od=J0c9F_K0os!c0V98l)9dS|%@;2Ol|F?D z<%>F7oXy^37n>R^@>(Y0cs48AqFQDphAE$&RErgjclPD-mNR5t_*taVh6y`eO!C?5 zYF$tB<9a$TE^|w*lWKMSrg~PDv%GFTdSrNc@1tKb`sj;dSuECzXGOiZ%If?lsRhvi zoIc*!c|iZ)eL#P}zg)Mgb^9`Fzj-bs=wD>Z;yiC!huS^*G(NjJ+Ap$VdE7MlVp3ka z*Y@cfkNVwLXJttZf+3DS-8;BH-hHt1DQ2)kj4ln&x?B4nPPao_YO!5bx?(g59O=t1Bh=UAf;1+;yH3RXk{$E7*gCV+m^4wwn zorlx=vwJ%;qS1eBc1|XGdhgS0I>GpMX7}SH??LPE`;9PfMeSZM|1To+!y!Vy%Fj!9 zV%2hh$@6>X=Lh+0GRY41r_qaDQ-b_rd)g@>V7f2IgQ8YA^-2 zfPJee80_umeg--p*!kEUnvbVhn~i5#>t^5{apvBq*@SH2r_)(J+kbFA*_l4Lzq_;d u>8II)+@FCD^a>+r{F3kgl3&8EZE;>qGq5?0XI-{3y#EKG^k(_K4gdf`yoc)m diff --git a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.clz b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.clz index a4084b6067d3cf0f9261c9e144d0334e57a6e85a..85471a9ed4d538533e58120570f996dd443a07fb 100644 GIT binary patch delta 36220 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 diff --git a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.config b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.config index 2913c74..b28fb6d 100644 --- a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.config +++ b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.config @@ -10,8 +10,8 @@ - 3/17/2017 10:28:42 AM - 1.0.6285.17060 + 3/18/2017 5:00:59 PM + 1.0.6286.28828 Crestron.SIMPLSharp, Version=2.0.52.0, Culture=neutral, PublicKeyToken=812d080f93e2de10 diff --git a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.dll b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.dll index 71a24494ab1bd9221832cd5d67f7fa1411561f67..acb55a8fc1ba9d16bab60c540da2352d7cffdc5f 100644 GIT binary patch delta 29542 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

DidEXAVo(Qe$Ft| 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 delta 15001 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 diff --git a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.pdb b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.pdb index e89f32570bef1b9217464be386486f61533a1af9..f639405965a801748e83de97f009ea90969ce58e 100644 GIT binary patch delta 44362 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 HS>pc#z(N08 delta 23581 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 diff --git a/Pepperdash Core/Pepperdash Core/bin/manifest.info b/Pepperdash Core/Pepperdash Core/bin/manifest.info index c4b0216..dde690b 100644 --- a/Pepperdash Core/Pepperdash Core/bin/manifest.info +++ b/Pepperdash Core/Pepperdash Core/bin/manifest.info @@ -1,4 +1,4 @@ -MainAssembly=PepperDash_Core.dll:1cb57e7d4dc5c0e9b66ba4c496fb831f +MainAssembly=PepperDash_Core.dll:9f208dcbcc49e496f38e91289aee13c4 MainAssemblyMinFirmwareVersion=1.007.0017 MainAssemblyResource=SimplSharpData.dat:315526abf906cded47fb0c7510266a7e ü diff --git a/Pepperdash Core/Pepperdash Core/bin/manifest.ser b/Pepperdash Core/Pepperdash Core/bin/manifest.ser index 3079acb16129184071e339e6ff7d97aa1f74acb6..ecf2682e2b16da5ee369609016999c2bb1d269d1 100644 GIT binary patch delta 644 zcmV-~0(G{2b{Ne82!NV-ickfO2spacxT~CLxf0?!O!7raz)2!4MCy##L z-}mM3`};mA+9&Jj+r0gKf8Q0qGoyF5n_{sln|W5Rwx{$uwSTnVr6=(ZCdJZx+9k`= ze3dU}`Epw1%}0;EXGnT4B5D@(^SjxNwrvI(^g?9f%5F(!%wqpFQ0yT zKg)Ix9vtKkrVnR35A%BuvV(`8`UKhxP@3Hy>@Z;;ZSLr2ndp7`et-1QtGwai@t?nB zWGKELQv5YKe1DA&Pu5LaEsoo^E+*?XZ_bu&UY}=EGlPabr~8xr+5YtY?!(Ea_wQ%t z4~cz0&1chWZ}#b@lZQU_Zx1|}iCc8BVJ2?h>Hmvn<^IsDd^;}*@W5PT`Ru`7KH154 zAKt(JFuQkt|I-IM2b284r~CW&XVY1HF5)1A8Mp=DTYt?!ysQ5g(f!jQx_k26VgH?n z)BCe~J2RruY<7O|@c#7Pr`dFZ@$Jm+$4TCU*5UUXVcv?`yFmMo{ri)L4-fY9Pao_b98C7&6dwi~D*c;*--`6Z-Tl94 z4i1Lq;C=N^Jm08i&UdEwcka(-`E+)WJvg{G+n+qRzqk9~{?6`nGI=mC1%pt78Mp=P zTg|{=Z$I}F(D}ej$HSrNc$&4@c$T$p0`3uC?tPj~$P#`!o#nIr2j`QW>4W>bJA0pg enmx$<3HU&tFoMP}`Tj5YCI1gU*CCrb3jhG#M{@1} delta 642 zcmV-|0)73q2DAo{y??kr-hHt1=?fA;}>{cVDT&!&_6 z5Ap}I{n_;XbSHl}`SjCCwm;o}`04rN;NI>zwR~Nz>*+A|FSB+&_~r9znw8q(Q!G|xGtcVP_LN?ymVfrU^d$blq*$6yyJUHq zukz(AUrvj>`RLL23`y^WBz=)zwbinz&fD>Knrb;dsTQkj+A0hsP@X+}_-U5y<+@`CW>CrWaJoO)pY2cY?-FO;zn`5y zB=-F@pG~v98FA`EpZd249?Zloy4Wxix9{}-MYD2$XjZ~U@xESGpMX7}SH??LPE`;9PfMeSZM|1To+gCRn{%FoMu+LFl} zVDkLl`T0RUn@qBU{pob}VE6w0$-{>S`}wC2_74swdvS^ngAJAb&A@L(`r+>WUo-~? zLv!%@Cwrc6)HCNh)B8L3XR~}dJIEd!+?(xB9^BvCeQW;z}YO~=!$&Bn8=brW!p_;T;lY(kds)9Eaq?LRo5>`Wir-`&~!^waD? c?oYr6`h*cQe#!TL$uIeT0ROa3D?1AS0K6x8TL1t6 diff --git a/Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.dll b/Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.dll index 3c782b2fd4521f63fd31554fdbeaa43ac9c11d4d..bc85983e4ea789e333662ec308db444be62a9b8f 100644 GIT binary patch literal 86528 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 delta 27113 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 diff --git a/Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.pdb b/Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.pdb index 8b58d9d99b618528a6999653d84b53a21b3f5f0a..c0dc85da82281d5b442fd070a2408f0a36431ec9 100644 GIT binary patch delta 46436 zcmeIb3w&0^wfDbgCwWLPfrMNL5Xg;761gNHgm4iONDvS(+!PTo0U{u`0KtNS2?`Z0 zTHrx8T4+I0u|)+zf)*=y(4s{PJy_9$6;825MFm9#ME!r)p4m^HAgKMn=Y7xT{k&(x zFKhP9nl&?P*39ggJ$s&-laV#cqL#OAVq2E=h_b8^4RCO6P}@>{e^OVRwZ41N>Sb9+ z8eiBJ6Z)z07usQwI~#mw6qKDMf#^i#;klc{R z)HAI@Bh{E~VOiD6KQS%Zza}Hazx~Q=XV6Z&N)6sx^tgJaWB-)sch>D`oABH3ezUo< zZ`p6}dwiw;^q7QgGlskq>+e4?dfTY+r6R5Th;1i z>fu%P!w=cdtX>o1Kh(6nfB)5aE7vCalh)>iJ&Z0M@ef`*HR?rNyTKmtlKQuz*sO2 z+yu%%IT#Nn*wzGVB901hGnfP>gDKz^FcnM#)4>cd6I6m(U^bWos=!=uEBG0xzy@yy z_k(%d&$s=5Sl4RcZ8&cS3&28l~H=I*3VeagTstJ`-{NIc#_b(e45k8>u;)o4m>ewnp22%Hr zUyyKbyk&g~MkG*>Sj&0>yqMr0H{oIbE6*g_Sxx;%pGk{&psCLKRsKbDs$*LGXSS*d zv#ieFwf@h(>;IzSR}^(>)C!I~fMTpqtNlYB&L1dpGq@H0X?J#ha};h#Pn05IqG#`V zk@P*@lRMTtBD|6(;e9b-+pQ1xQLQ8w9#8i>zl;)|Ec}G$fu{aDCf(_8zp*NG^OTRC z_RpI7$#Kzvjhd{>be^)CT{J+ox~ax4S^Cj#Q~(%JPlt?tkOc zyzmWHB!Yggobiz=UHm7z{)wKy<+ClH^%*=p0g-+^vw2o;%c_xHPiVNI5mr~L!0Kjo zw|cnjQty+yJNJ)M&D#|j{yv7kFEpC)Vkkynl|Un`q5d1^xAFJf8SP*GZ&m)#9ZA05 zlb=@I{cU%&vRid`hICiA`ghH^+5Ynt{?;=ye7gwE_@UeqmE1bZ)9r*79juO4Co9{^ zaWmJSL^HZumf~L%|Dxlu&Y^TW$)C8hb<|>l)_^Tw@3sN2{9gG(pHB*-nfY$;FPziD zU-?3K9urE@aWB>((5OI+`l)Q#Kzt*VV`bp!#3w-P}CCfx@mY-dDYxGR)Q50 zBZE$R;t2np0qwSTP7PPZPRdr5-}FY;HmG3N2D+Pck{so;V||Aay|cUXhR<%*NQ!j= zBqIvHMgvu8zRxFyB^eL{@*?k(mcm7Y3tVr*^Onh^b8Ms?>-4^$!Wv08yb1{GTU7H$ zrDHBFvnoW3lGMHH9b|qOT<`&N22Gh$RWW1Aj7h>H3fPbELgGri4|T4aUOI&or@Vn3 zoBJOKjp*T4s@CSn`cg&cJOrKulIw^blI!aFGW!`do)!IbrEB8;{Tm4+1t&0M?)32$ zv#-6m@3biuGpgqFojGGh#e}MgiEv9|t&y=8hzu`YD=Wn{hifd$rIs@#+-|C_arPWh zMI-9x#WS6?^lNhI2-y)*{QsA8-tpEh8|@QMjDXH1;qziDQ>?E1RuXi^v?{V&%L zP29g{Na0Dc^=aNkk-YleZXz`diu47MzV6{Xv`7`)bm^ovF|^BdyXk1e{Ux!&7#UnI z-NM{z*hvai@C&aOE|w{LgZvwowD7M#6RHL|sS{PRCVVAm3&kDQd0yOoV@ER@>FAlSi`GkRtB|vX*HWkD2aFyr{=03FcIqtEt1L# zTxSu!%M)HaWe)WtO|od(G}A`mltf05ze zX^4S*2IP*IGQDE9&a;$L;_o%_C;yA_DYw7DUpfSIKG3v;GmUf+%QbQTUZA888TnTI z%-qzseA=|}%Ad)s&etB!cA4Le6d=a=f^nZCx8ETd4E9BPyn=M5^;-X5x-h z17=LDm}fON%{@50eB#8}6?5kJ8!x%CYyArIOlNmvk;!yeEX`csP>ip=VmPTc+VRmL zF=xr+GMI(&>)y_5|Dh_U)^A~+NUuKRA^_u`2DczCde1{4x%_4Plwq;Z%$f(&(a z**hd=7f}xr^+}=*Fv&?&$wggMIth~l@%QX)sK0z`(@Al}J_N2n!d*cUq+<-0FlXwp ziaC`tXUwV4nVw9X17IqAzc=xu3$ibYH=cWGir;wt~JCFZzGU+9(Z8v*Q+`=-6NzqnRpV%J(j8xyuAZIC z45Y#o8h&X7>q$G0_!8IS_tGEXraz)C{p|YbUuTRpn`yIL*_yb2LrMScVy9P>-M!H? zQ&Tzjk}9pGCKWmXT3=1YsH}NCHTCY{{Q4IZxNxTm zkEkR9-LO^ZL@iTIZRQPk#M^{5wIka|J~e6f4!pC~qy|9^-TG#enYOz7=#aROd5=JE_i&hIR_%Rg%$@g+MZ_8@S0l2n|l= zA?|~dS4LJN#d4}Q5ladqRCFV>&?>U}STn6kG$MvD4?M}Urz~&` z!7Ufh*ny?FEyNLf-UgL|?|@1L{Ry3PfWFSX6!{HkA@tACLC^!1btOd`V@2>}8^HpQ zEc--Q4bjRkK(g!hEb;3evi=hDHgP4t??6Q>|KTj^redo%;-{wuDlnyxEUXb;u45+J z-=Q}5$Dz_gN!_JE-{(FZ`VVLk^qbheXfv?=8npKPW=qZ$PyDni0HXk0k+$s%)#uCQD zq1(=-$SK_WxNi?_0L_DjL$O9H0;)^YnFLetkrE~2P6O$l^)ztpch^UXa@gD%~&i#0EFZ$}qeFgL?D1EZk3%U~88|sG^LRUeHpbtPLVF%im z`!%F*730`s0)7WA;eM~Ve+9}bjG8|}`$OqStN~DI;{&0zZ|fQ;?b{jzrF~n2p;~jg z4s<>BCB$o*JzaM^4>rxF$=rymrTb!qmrjgyE$Js)TGzX7VUqSNmu}bBxb9}|96?4M zgjjcj;jUYFf-77!qNixeD)*m$E4KPNvL_XOJyhE34bXV#jZmq`G0<+%aZu4a-BrzS zXc@E&S`O94lV)-YxEtI9CV=*!d%##wEfX(2#LyqeRZUj)d`a$ZL74bYReDUB&b@R3 zQb|m|tr^@)Bbf=k-uRD(vXEUf2|5c}W&D2zoz1-zc@A`m@xL27m;0sATj^7!XLl3$ z74&BWNafSF*8H3CmrAFPt@(E-eQeDkD2r4zblPq_I%jJE_cl3S2-VtHNXaED(p5^s z9O=5_(MF8C#NdkOm2Xsapg$ERZ58oW5pL-Ogh{vTD67!DkFnYY)G4nAzQtSdkLKZC z&G{>8mTL)_5$DgLkxbwss zebN2UJE0O!)cQ;Ae-2#^eH6L^x(&J#x*h6=?t`v^9*0Ui#$M|IWmVUFhhsGX6vA?# zbfhi=9i|NIHFN~lgHWwj>7_lDwsYOO8C;L1%D`GQ*8~KI-G#plVd8%snCixhXWAWQ zB{kyDBqL}}Vigkw@}jcJg_t3-8UC{TTFF<*ck(aMEJjqxuLN7oiL8*n^+{Z%qKvU$Y z<0Tw))YiX2`#|?XM?znQ(to%SM?wF{J^hEZ4>}F{D$V$J&_8icsjU4_3S+$vB@@;g zP%>ft8H%4P=OFX|_wPe-*F;pikBV24Kd;_9P={q;CXn91>k4~N&jJ~*ysq$e`j@5P z=WdtSj5(8Zk2E_2}D(yMSn(qn_gYxX5 z44+oT&Qr@&^O0|na|&P`hDxvcHZ%$6bmp*VL0d-sJY5@QTb6P?7loG*~7tIcg-g zA3?Ru4nZ>Oax2Dnx5;g`JGy*I43T`wjj78oUD0XoC56wRDbUZM(qzv-<*D@xs8r*Z zP@STTJ)Qv!LPr@uKY~j58Nwvz^4eUkqhPsB+u2Mb-3yL`3m_?kXAdv}OasfnMsNU} z09GikUqLqL4=TY@um$V`Rv6)+JtzicU>;ZwHi5n12w=6&O7zi(=iwLxrh&y^BiIE_ zg3t!MQwD{g49o*-!FF&2oB@dxD;t!8$zU1S2#$tt%f0Z1TKP(fJ=gZ9y|Or5FHX#{ z{ZG9z%y$-+qzJ$7yYtWNdsyBW`!~M&io7hYJP_xvdF^>|_WYCUlX5W5pSb@i@e${d zI_LV=U$SqsT;F+b1e~RReoWoy|LV_~J~oH=K5OmVyIv*xOAchRWnkukr;)QQ<={VT zq2Y%nhF9k?gBt`Ug7si0I0DXqXgbCWPzXkWO0X2H2Rp$5Z~|CYpb1b2Mu7!DUN~$4 z`@nG^uQ!q~E@@-!h?2{MB!gb^qc|0>p7~p@``)~8Kkv=^zxRxk_QHD)3t4|O!=7&Y zUpu;!x9E2r>lT(FFBM9`WUv^l1v|k3a0-NDx~)O&@f4Mzwnd)sxf+i9U}=M%c$Y?5 z&LgR++#mX3l8-Ua_uCx((p&7OfacH`ieJAn)oNSihqgkUb3V$9^uzjGjx=^g!oXW? z|L%_>?dNjjy>J6v#Vh@7PNw@9Onv)v{6kJ=#q2kcTAB6EVyC=H6$Q8t!uDF2qzq0Y2nD$Xezro#OPPKT-z|DGkWPR%ft=$l$Tw`#KG{CXI1lRk@fjtoKUUVo&Lk|UG`aG%r{+h(G#cuY5XP5iWk&X4fML>O8>df(tR7r zO?JLN?ejDn5}em{pQroSC*@m_?|k+kD{x?2v>MuJJ7vuRz zbxTOUz}wM&l%T19*O_qD&;Rn7v4IR^ev$5b3|WtK^$+_Z&4vVL;Po%kBOfR9qpqd` zuj(&5TfU5r@qE0Lu9o+MEtKtFak{Cqyq5}ZnMiZk2nxu@ITOFRF~h6A#oDXB{woc6n6|Q=*7M~t7#xSLsBKC4x-mTJAFQ@2k z)uLsU3>~aPw1M1bI7Ri+fA{jA{_1MA(%@Y>d6V!0GraRT*di z5$DoQL>zY8t+LYGB}e~)uSZGC8+W0(|J2tR zG&8-7D=U}&!V5`u^IXFEM6`3;nX-oaH!P3!@4B$Sru}sPX0-iyt}LGUw|tXf(;VLU z=6U;k?zYw6jt+^)c5O(ee8=vObs}xG*y3Q={$P-JH=4)L(4$(J@^8t$H$5 zv=podyTM^_7DQ8R*`Pm|2o`|#U?(^N!da%8TbAO4Ny`zyD z78r4ACpT8DY;|Mp-7#vu?PKGmuYH{J#)~RXZK&-Lr_P17+E3J@;4F~0I_*Ir7zHY0 zoxe3!3AK}lsWoaxlFC)#x@(zZJKbBVeRX#YTd6erR@>>=N)?1_o1A0U&S<4RQ3*?t zv>xmP^1kU52#>3sJxblLcBCOx_Lb$OtMQb|NmmmfU#F`~AKO8F!;+l8wN=fWzOB_% z#?0C+tyP9?&$OL)+NxFJQP~d7P?$evs)J#LDRC$s3<70f9#{r8g8kq)2<1^N35)>p zs%0(M4)z0o>1!$BOg!Aiv^rajCNDQ;yIFcMTRj_d9GRbI`ZQI@Cdl?q@qBe%SOey*H#)zWui~2@ zafcQCIN}M9M)cin+BJ;oB8tDChdF6%f%1ut~yF0vQs&k6y9>* zqM40fo?P!0Xo2+JT*ByG%}L}-aw9tid7QUG;gN9sWXGV{dv~#<&?ktL6=Op{geWNAWrcSek z>WW5VhJ zr6K385~I?1pyG*sY$k!@lU zj-NcnnEjbv={-s9nGDI5riuIaN+kXDYSVGlZA8P0LSmL7^(+wnzg{g_yvQuPEgnaW z;C4ZR+avg_5$vcLc8ge7W;U#wfv}#vluXacx9|Wdmn?31R|jM!_cx|iG{bJHWy(Zv z0qnw>+~3{9GfB^iJPml}m%)>ST)l#H*%6@&j8Jxz$@c(eTZ7(KupP-~FnEdM@yWBV z^aLZ_{W~-|Yoxaa@g(f0U~dNdeMYSJ@H^5O+Qe=lFUJFY_nfNPu3n0XauW1G)&y)q zGAIwaba2RC*Tha&Bb_}>>}!X3W%6oupD9y1oZi)mGCgmk1a`?0D7D%i{#8KupC8~f zTB-(_%@7w$&gPj)E}lLDS2mL09pFCSURA$|dppSb^N=Oi?=^A%<`C=Cy8MWaoklb5 z=B){pJjqjC9PuQM$LGy23Y`r{WE_vPLm9J*UTW&3{DL__p?~OIOw9hELY+eQzHVvbf&Wt^$L{|cGjB$7~$l(JSWct3l-H0mG!?^c54Lh4bTH! z;H5nk=SuAhrA4|c4r0Q^+{-h7tUyTD+>d)%i=%1O=(hkV+{w~pM?>rO21u^IM1WrD zcj+Wonoyyl;+0OzM7wFka+9RHV}%({ zc;+K8h^B<3D(?`~+u{dVr9FMJj% zm9<0ooT6W%jQ1Gq6Yb`mSXy5sS;CO1T^{eCGM2pny%PEdD03?7MQDW8-s#%RZfPg> zb2m8r5kIM~eQp>l<+8z{smlG0zGJSMueCNF&co%eJ}XuSo+2Cc(Tx+&{z=f35tN44Z&D&b;s-iRaS$|JCQy$8EEk3yxo zB^zQa$GDG${v9eh68|>P!@wdh(4#O{xpb?YhTo0GU-aqu&%&=P;2(u~ z>o=b1E>8^INffW^Lab2N3d``-!!I*_cdM9UjzH>`4HaVyfi{6kKI5UG+^0grpn4Vj zN+c%Z!#v?4$$I=%Ry&cL8A%M0j8IH4V{TL{(?P{c?QI_QKdXR~)jD9x;G;owG>0wo|PIHj$ z2Ca!D`D_E_>BE&Ooj_aeMHB6yt)UsvZqQ8VwNSSvq13kfBKS(^Y~z0`v_1DfgLZ&o zYVP)hpF=xw|0t9>Qq2xA!5kbi66HZ@!0vv8z0iE_v2S-9!f`0ew(h$#Nf>)}w;h~- z_P`%Ab+;XeNlG~8`54-{I|r-p^><8M?j?-MnbjWMX?<@*q@5@*d zZ5%X%;G3Y*PNc8{pk>^bLMK3n8UInxo4KC~odlh0{O3U@bN@@|6zFOwP1Jo$KOOoT z?q@(ZLPh@L@~TB9Q|va^c3^bXZMPZi&&Tx4XGK!zbdX3KvB;5bVb0)|RwtiN z%C!^ZHD%EPOau$SD(AV?szua9VlDt{z!v8iUez_txCNWRUT_$k0+Dpctw9->2bP0P zU@tfVLg}cJKp_|fs=zX^5$pnoz)6rqbB!ZMUs+zYrBQ-3ui9#Vxl+wiJ9??4&_;Q% zmV(J(aZ+v88ugZPRIxhE62s@k>Nl*;Uz+L~;EN3{djvq1?zj6esi=qVMaxJ4{^}^MvvC)~WkCIc?dO-JVwnF;AK> znLC7vY-hl5b*-v)9vn{Q7LmE!9OtFss;v$EaCl(ty4oop0mGdzOwV!d9l_e)^x&5} z)lS$*!tWyd-W;dnNCe#Lh9~MNljsf2xXpSV>7qNf&)s38s$SQreEV0OYHz&`p_1%F zqtv|-({uFGLQ8+@{8*>(2CM{ucl^D%v-SoxsAD2SOE%~arh&y^J=h5jfs-IKg$f1* zDYXe()Q4)v7#5!~uXbbIwXk2fr1sOXDoiDo!dC^Bf%RY~*bi2oE^tmgtHPZ@&#LV^ z%G68lN}qfZ>l`j;*>ywhmE+YUk@|Fnim%-?fzMA_eC4LEyq2szGfCY{Xzh(tRAxli z<48OUqEj(VPz)vm8G1K@UEnA<3zFzb^FV2u<*uRC9@wXHXlzw#gEWJURcg`0`(8IUw1zKtLh|+b)zW&3w4>! z<}kaLG{^Nm)}51XQ*mJfskvFs>psTrIGeR+fNrf>&enmdl{2$Sb(ZY7{QKaKyaxW| z49E(mx>t*akE|(NN>$Tvd0+Z`^d}Qp6mFY_fHE| zjQvr4ab4~}9K)FJY^F2r4%N{@%py#*6j;bMz>*48`C970zZK$kFNq&!Bf%qp+__O)N zH{10O2%NPDfur&NU6#9qL@(Po%8qwV2>*@vKkHl-W%qD;-br0NONIk)F^ioIcM^9D zJl|$HuidHAV!kyQm%a&gTUR;d;dZjR%KcI|p!SNph{l-g%eqpQjnZsr&>OE}Cv!1X z$YAZWoO6xsZh^e65Pt@5U%XQuZMSodE+$X$?d#>KWC_AK;=y-iduPTH)jz+YuS`w6 zRdR1hXSqxixW;PY{^c>iSJK|7zHUiJK5H8TyReqDcb9a`qLwGrTmCrSSW8BqnMiPoenIEh;U1O4h7Px1XkH)>hg@AWasTpw=3Cgox&I#3s?joJgu)}? z_&tA*8e!Isyo`F)vffBC#FaD=NzZg}*N*Z{+rmc%8*d?Ti%cQ8)@tJZt$=5*$+HtR z({7RGE*Wh^@&ed})eDv;AZ_?xUoxUsO^>&8oSnZ=8P0-uJIT3#D`J-0|Hw8g7GIpg zWjxR<&(v>V7t0O(AWJ7V+w^g)g*e&w;rC{yGx|Q&hmOkmH8kR^k>Rd{I2VM4zR3L; zr|^EZiljQHo7yd$#ki$odFp=R^l{rX`>)-3mlOF*HA>BPK2C(M=9g-aO~3KRFG+*G zfwcjr{c^S5rayRNIeE#tvNnH(YNV9qY)v9U*-Dis4Yt+s=FXOtjLui$KGHlVl;>kn zmQbEi-3MoVxJ3nb?nK&MB+;$Yn*%zfew9?+!|?ZlO8ha6=-zQ2$b6ZC0wfflsLG;O`am44Y`+xdFeD7a!(tP&+udfzQvNctcZ_-b~KE+ zP^MKih0w;(tD(`*!B7!26pDGcvyCRuN!-UmWtPD-%>BwE9{MxxWv2T}Xj7SCU2oGU zWggY6CElX5R#36*G$_NimF^r%wwpRfSE6r@6({p(VPbB#811+-Qkhq0J5wG|Eo|D1%*0|k8#bAT(h#k#&ejK5YSY%Q zthM^11DSn_u%1v+(N)mkiB~V~OYtv)4ugtnMnQ|YuY{IBMFld+oDUrUt%34*QL_Xp z{7a!cKGggQIuxqweFF7f=}cIyN~$lQl{l6>+Jj;+1}p%pz;>`7oCKk*Eh_~SfH9y7 ztOA?C0dN9D(!sU{{XrR609JubU^h4fPJ(cHw-hj@tyOMS;aCnff!*LRI0GWv@vsI4 zfhw>JYytbgQE(PSqqYn%2uuWv!CJ5#><4Fnv-@LJxMPj7z1Qxy*iOR-)tGSIv2i!! zLAA#0zvHgaLuz;3-CrN#1-*XWChW0a1&7U8t9I3e<*p09`*NK+U|#GK?~Pvv-#zvl zwY@HE{CdXtsZ8S5t3h>ndS|`b6p&qe?*_UF`xd+Qp@&tLIGk4=Q5yr{&g_jU&Bp;y zzPl3LeF*_MwSV2HW=B*<(zCS(#b6Yu1dG91a2T8dar9*EL4QyN=7Hs46W9$7gHs@! zWsek407}6;upDd$`@spomjhN3$O9wVGhd&ELmEu&flxbJt=__``nil2_jYvJZs9Qv z%Cv8_D$-9xMe;<{!ab9Q?*96%Y-5-Q_tWl+ee=9C*V(g`XPNo<@9F4#xD_eT=a;g) zl9It&hdxgEGl5N9bDc+@kp~}`Kkw+g@eIsRc``JQU2~nm+hDjIhATQbw{Bxrb4Bn> zbFTA+gfAdGv6ItkJK>4-!`E#md?Dd&IytXMc$@m+CC?Im2jRJ$oEgtji@9#NnahbX zWO)4y-IW0pA}jq)(hkOur#m{g>|nExly8R`9q~E+sPxN;?pT*y%W!l>CwEw@5;qzA zbuB|q8|`;N{BpIsaHq=awU&C=2@Zhc-~vdZm&*eqz%;NFtOvWmA#esnl5BRz+GiTs zL)4Dv)kAgrW48QW<;#5SpS#pQnV9|g1$9o@mA3QRi|%?t$Zi!AmeHT+V?Y&H4mN=U z-~_k;;yPhA!0Fk--n-)!)kG$Hj_mk!GWIDsc*#9B$zjf>7cX8lix;oCvo_fi;VgJf z=8w*wUsI0=f7PGVYevZ5$X@d6>OIJJE~$O*4W+`y6_er^Pz9EQO<*rL0?vZyY;pyP z!6;A(mVu367dQmYfXEzrB2Wm%fGV&mr?yv?{gT@8S9P7cF=^CWZdTa@6Ym^&ORaCT z8Lr(xwvwI9slB74eW%*-j+(9HInOQn(*Mv)J<;!@hteZKH;M1MH?{lURpVU#vVXu* z_@3G!k=>ifqw2%Dn`3GRmGf`MR99O(U5U}h-7Qi2X2Ef-Wnlwm&w6o3(68dwU}gI(YdI0eEx zqe@T+%D_CZ25bTQz)=v&pqm5=Kq;687K4po7dQgWfHUUSO8Xm?O;DR z2}1MPNS5!|*V^B%KF_+7w?*u{-XeCMEn>0-uNaI0mHE#7L+#nCFQ}Brr)jqbyXmJ@qVE zk65xN+3PEM(pTv8z3!m!TbeuRxSv!nmYeh4oTt8}KM2)_vpJF9sX?ulQjkqxH#h>$ zfbgzV5XkH5+&a>}ca{BXtbpBe<2{WeDw@8#X^y6*>{E$@;GPWRP1!228SDnD$Ji;g z8%Nn=)ao?*ye#BhNVCTi^`>-tPou+doCKi-=)It};~4udYUTD6-^&!NyIWE-esL7r z_<3o*SMV=({S&nYet(e$h$QE}Et{gk)99$&w=qI5bwpjUIiilXUDE*V(RN*aTA=%F z2L|YV*MpG}-#wx(I-86Z1KHPF37q9O*_8uBiS13ID&;wj3oQn&0xIdZ1GR1Z&{=H1 z9q65O_mj_J>xSr~1HXS38-6mVnav-P0siyRn%?_$sk7L+!| z7Td)#FLf4M4`epECaB=`Pfc?tg~4aBHMz#kwb?{;@S!|Qs zLYnPJ7Yh#cX;W+*ut?UX5j^jj;Ir7gSl+tDrOsmON36TO?EJuP!Qivl?j~!2v)C?9 zWTLb@E?M>TE)G%kJytJ~z#%x7J&WxzHxY9do0rHBoyErKtiG3n6Zu{mKXewGmx8xR z?NVp4amK6fO|li(+2%#^>ibe>v2iG@FMUw(S!`Y`FR4qN#l|tRz7B&-JG;zTY+krn zru0!iau(b2!CIWGj!DJTJB!WBleb6fQfIM^B2Sx)kRLmXZPVZ%FcIqtZ5XnE;a!}U z>pSiVuiFCmgJ-cFcN3YUr*IdSAUjfvzTHa!I+{e1hZwE?$XRS2pJv3b0nCVu2BwthymXS`%SU=-5C zNZoB_a(f5oy9gD=6)kgP5gwj*gRe-wOGUD&SLY@ z_By;voy9hRw5Qgk{ex$*d3;{FmphBiOV_i$OP$3wk#z5^OZO+8#pdyQ>0jvUku{}LP27PlDn;6~HV$-wC|98$}D|9uapMcm(!6lET z@qGNDj~jj1y}$ffY-0$Y<;IKW{9i?X@#ugu* zKK{s79k!$XpE!%{X6o@@J&WxI&R*+_oyb{i{oN{W=Gu*%&n9QFO#;JR`;kCxSHtBj zwk-r)d=?w?1D8q87}hpZ#(lpL|Mh3F>G`$H&g2a1_s}sa{x3O;?Ov1He;S!5py9~= z02&3A$p}kL)`#4)QR*k1#rCv2dzZ%vIqCCLVoGjLL4&6^r@5CDK7*z}KZixd$$LJz(lYZtOfhP zQE(PScjr|;C;`8+G^_iqK~FFWRDz{oJ=g^ffwLgG=NJ-WHdYKKf(2kL z*ba_^3n1kx_5*-Xpc1SCo53M)5=65HG6VDnWneK_3l8^khAg!cYWpv>cdF{|xSB_F zIxX8`7xS7bp7M*{-^DHTSgNLBDVnZ8x#GW}p`o#wE<}IgKeD~?XLOSL0a=>fL#4_6 zEM6H4eY1m0tF70s)E*D;0z?9$s7;~oHrI5hiTDC_ApT?1HGR`0IK_m&%&M7$kIdCH zzNO)7p=q}~O&?%kPxzMbGL92H`OYUrdpyh52ni@>$DYuNW}1F%670hJMe&dF!l`h% zpB|#=3O4b{eI_~%crcrr0>n`H|zOj`Jx#(X!icA&UV{$y#7~xQ( z+IXYdDXE%&gKIp*Gpbx?>U|h)*PF8e{1DbcK?k z!K|hUO*Qm&dP=$9VCY;!2N;@a>iP@Qimo!PrY4693rrMbJnI_(I)uzNBn4EuX zO1RMYM|gr`bjc!2-Bp9dWN{dWC(ZRHWO!j$+hNjEl1Fe3SKjMft zs(jQ~`5vRvS3`C9LX-3NjcPwOnp$F1dfJry8xt;{or>IZDVkOo+Zk*$a)Y*sYHNk5 zqlLz3B1{f%Fe>MP&lU8x8I0aEB`q=;l;4k)ga(+5-e>xQMMlMQjRs0g#s-@nwA@XH z`tM>?@qnpF zOU6mx>R?Lxg|Yf4Oi9lffn!a(ebSWZQB$H9jB!3->UOBn)T2hutKD=$&GI!ZF|BBd zDd1QN?6&_KOi4dB34LMO{SBtX>x_|oVfqEW;BiYZ(sVfIjE3$r8T-H(>vN`=MHmg` zbky;>8Cz(XX4?NjZx}TZ-ZsPSe4~jRW9<)^4BlrFY-ti)VOqrvMzs}Q2WB*O+GuK| z(bT&}Lt~quf2oUjqnbsj`aadz!V{hJeUV9cfN2Hy7>&JYjCYUG*j&SZ%oy>rCL`>3 zchgyDO8$b0_qv>DFB#Zi1U_LpjxQJl#DA7iWf!BFZ%hgI7$b~ouKDH~)lN6@9xc%R zsitF_V)~JTM&1*KzxwqQ%{bjOi|35hzF;ym%T&diMuqDlHUI0TznE(@^K29CKQctq zFw?4DH#VY7^W19a6kUL7E6k{Rp=s9xOkF=`628aKa#PZGP08Yos;3*xG&33hz$851 zsQ9#re}kc2O!MsGYJ~dlW-_qVWZ(f)vav=*=Zq$%Qyo$z$|N-3SoK(wkr-pdPns${ zW;C+I7+Zv?vX&-;FN-YFx7HaWd7*_)pqYtypXnE#HP-!{=|Ju?#?;Kv2RrL{2aVv5 zOxEk5SQF(+>ja}r z|FI!T-+yD8+sh^+=TfzQgz+ETj(chUgNeZiD`h0(-1V;fJjHSK@C>D%8l?RLH?;Z{ShO3)c9F@o+f8Qo(N zSYb5xq^Uxw`-XOCStzy;ZmadtMKxB+q8h7ka*BKw8@@!s8(O zE*b_(6BcF{Hf+xEL#QDf;n97pLLH9IV38*v8}*8s`rDzhwa!X$<0B>|#ahH!Jxd$9 zxhhPAh|rW8G7ycF6p_y-x>dq5)Tcv zqsdjYFp!kQj=t0G7a^sD#|pFVq_J5sO-L?-tQJy;m4!Y zV#93NmXfk_*(_>OR9rBm(3rysvTPe4mm$E>X=iA++Lvk14 z%b@eXawoN`9b27(m|{>0IE6xvWpdAktAVZo8^IQ^3mgJR!C8=m=nRkt3c(;S3RHpx zU@2Gy)`QJpFE|3ufJhobYrrYJ)mDETBS0CL2iAg3U^mzg4uj+16u1CVP(U##1(QJ) zSO(UBjbInp2a+&_43Gy3!5}aSRDuOy71$isn~xlE>;-3lY}KC#D#22)7aRa50Ph{F z)}SXC0j7a@&Yl9hY4s_buE}5)DWDk0w)e@P3LFJ;@M;qFPzVMA`Gt#0uoSEZa)|0q zZ~z<5RzaUefrkpkKS zIhAw_r~>jnV2yLI8%A&l=TRUBmU;)cCpAKUpb!iKqkwmq`%>KN!Cr6x903-cP$Xy# zcYQ7K7zrEszs7wuAlPFgVqiQ!Hp`?s=gpP&w_r7>ogvK^3S0%bbPX?WS!` z;yeqY8DBC$9w-EI{`*8AXTUFT_H?&f#LE%zM}Qmye+F1hP^EL4AP(_}>0vh=SrAKF zU<{ZHs(^gfzYMGa^0T|Uz&>yY90e!ASrE!NlL6!m^g}mMu;jLauUTpa0na)C&5_|%Fq=Jl0XK?1BGA^mUOt@Lhqm5XJH5s&X)H^}J6SM1r>0GQfZtVCrCieL8b-~%r zo|$%Rqij0KK=1_T&YpI+klg%y=MO#YSva~nxmVe@s%U?Vog67|k|bfdoTAu}VYPQW z#y7ssrmO5xs|)SUO>(<-mLGc5*^~4$oTw>w)0VE&f=Y2&oW%tq}Rv%_Lqrb9PmL zU;AtRikv$B_4M=^mivWTJ^uA!Sgoh4id;EfM<*a(teFVICzsEzn0QUa{J_^{)P|Qq z&1VwqQWt+`UHrgj0+))vv)W}e0#I+h$-rbD{d5Mt7yo--qKOfC8Pf5LJT&Q9_(@k@ z#|c$4<+N(8UGZz?mHy_uI(sW+@XK%(^<|)QoyM4Mrhr}z>=YKud|VckzV_GY-<)43 zax(*F#zh}~dHK*`CJr{8W^}-r=+#8J^aovDWH~rJPzJ0$&}JA(GpzdGX?bx%-7u42 zw>q27WAG%C6*DHvcKi`D`%bH#QZb{dPP>}HL=0*SGV*3v7k#!Aq!k@*;?Wp7ni5(J zqZvQ+5m1LJei=SUkd9ykO{i1VSyzyJh7(J_6{unDZP>8}ueaFCFq~nT2Is`gpdZj) zhLxt~RYEAefY!R15(Voqomk43+No)6Rin zJJeY))DDl4bsn!YHT2#bMkKwob{0{m4cgO7r(2Vpn@a3vPGN~1+AQ5PN_k!H#XT%s z&e#$=xh|MC>otkRblK_7(CZjRT&E|2X6osrJsoShQ`(Rt@!l=58`p`!Xg!|8E)R$7 zCAV~)o*2y0>uvhe-=;f7{p{G1Kt8bxFL<*ATlG65?dNJbryLXTG966^neO&Q&X#^b zXi{>g4)*4?&ui2lLJQX5{fhumO( zx9iHfTm|)yN9lD?O@BMRE|?zBt0#GmPj~o%te{{zJ1;nzJ|NvWM{v1UN9A;Bp2Fm3 znbHG&VO^J^{Y_D@3Xi{aw8!6PepSVsKo{itI}6L~rnRdE*qx*q6gaO8v>%{l7 z_IGobn~l|Z{PSp8nU{D7(Ege~2g~!S@@O4@@H0Tixl?!^AniaAHKP%LQF+aAIn6Os zKa;smV=g&p*<)cs42!h(WY_7jpjeMZevyV^x=p{OzA;JB;Jj9{okC~ortLaCIpou; z?=dvGOlQMXnyu^fSc3X``4ySWK zpsYHjSw#~k>No*@?Qi&lj6ag5mSzoerVg{4H4J2;bM5`Z?B{K#^(}ULwb>bZ3+3BP zW|K`B^Jp7hqmOg;+(JW*qX!8DV{cyYZt<6HBe_K&IH=2*Mj4a6E<@kwOy&jYsenQy zOPA3iJ|F{2^R#@_$(hQ5wyUqRoAAcaM8~SUEXYseCOe$!n_L$hR7pMQB9fhR*HKAc z>@L)TCtZFgH#w-MaqmqkUFbqRKKGZTq^AiI!?^4<2NrG-LoZWThA#93Uazsm**c9= zhfiH^hn56#LF4zr<7nB*7xh5ePnWj~M(HIrPk8lnNa-j$G@!FCR7-dBP>$C^CdY;58*oN2dhBnQ(53g4x6;Enbo zp5yb!*S;~9r;sMO`9ZCSMr5TrAB?kGl%$$0bPXEgCeprBFS0Q0r<3oBHF_;-pYS>Z zZsO?YREOi&V#8z^J=Ix+PqTn{yCg)yqvUHy6 zq?WnK9h2l_!93Nuq0CNi7?4-t{JhLQM@OAqduO>ltbuCnKCL*XCi5)b+LX8)1M@Pq z1%P0Uc7nKn2vY(HMKyz2`r9y69ri((-AL!IFP*FXtwq+(Oyc#{$h5!a&!Z+ies}FG>k`k?ve@S3GLO3TnwPAV8UEns>F+&GYd(`8 z)#t^RM@7He6Obhte*VF<9qO0|cHAfcEvM#b#?WYs( zf^B;3LKf1p>ekded0i-=r%_ou%eu^(T7W<3L08tzvVLGqEf5C-_c~a2O)cvutf>Ve z2aSQUZkF`}YifZwL2W^n%*f;quc-wh1~mp*Gt2ssHMKxI`Ze!qRF=rH{?#?LfS`$W zs*=UCEbEeMY5{hv!E3y-fR^?BHMIaMP0gzWSyR(Gx%`@#=FxT}Be2&BWKAv08-agp zP0dSOhGZ{sSw_nWUQ-J&(YU?B$eI~UKe(nAh({augv)xF#QU)|H4~Syl<~KF(3)D7 zI~R+V<+Xr(T2bw(e{c|gTlom*XAwDyP&tZc=}@cPE5oe3)|F&;Z3=HZ@n0V4w5_yz zCR}Zuq&>-Xik^*r-HQI~^C;(3rQOAOveNF5aFw-*ep;?dLWNnvs{VY^T1$eo-qO+p$w&&;yhC*;a+Ai38F{<==#%ARZI_^-Y;%E_G#Q-Aqb&%HJp zrsbcCsM&V5vvIbapU~CXufr{mq0G(bZ2RVfOzVKjV;n+6&b)v4e5>bkD*WAZ?5+tt ztW6gQKTH`2Z|;0D$1YANvL@3>$dw2c)}_RED(CY%5HqXnz6ssjofE>)9|*&mXS5O$ zougHD_k=vFKi#QZC+OFOVYlRtGTxj}VC^=kdyz{etnxOyrSs}sdq6_5bp-XvCD{<( z6j6}NP;#r?C83j5g;cqU8T*7`y+~MoD|Il~nr5WSGle)0NaUk`x5p<8af<;u4X(X-37+mv|=xk9U> z6AG;hCR1L*hmAsSN$6+EVx@a|s&Z?3zI{tVmbKkfq`W2+5gBg0+eogh`~Feld1kcp zeW|3|u#lwN?c9WpR-94e2uxZcmq}@}PuK$!u9P1+b1$zBmP^?36KJrDRb>)AZW6Uj zSO;hB0-8VvYrBpcsQm+yVt$6LT_&1lSRkz|`xtreYi+0D%9X*$B65yO9ndtAofg%YclUs1yyU~T zd)8S~O)ZvKXN~>Lqog9?faDK5NOVqBW4^tu?S>)SBtKd7URYxfNyxF5MN8tm6{o9r zi}5*;qd&HFZ1V~uHapFZU!uT?*RW38H-|-jc8j(r76lc>SEU@4cJ1t?z z_Y7>Z6uj~itfAfa!V*Qo@?&ta9%sJ)*vVLD`5HSkOpeVi*C8u#Mr-E=oVK%2vh)a#x&5{8M>t1o zr|c4*sh!(#PSMVmJfWIA_r`g(_We1|YqV1i!cKIG9z^a3IAgT)JkEyN8QNV;!ewZM zv!OHVSMbUQ%1yMhyX#vXNre`>yyCRSb$8x~3~3%FUoc})cvattlTx@>J41y?``bxa zvhlk(>@C7fSIBulb(h5Z@CV{W^r#n)-3;cEh)D#doBNA}_9iUmGGV2JHNH&PO@v*p z5O?$-{mTWeBckb$zE{F02^(^m1ivP%;bp?Y*zC-m$y1dxE-EA;?5|f#f8r(}Kfl{fJLQLT$7*Kz zvD;pT`S}4dSh&pZ;%uUw@=L0}*UsM#q(^YJl8DVI>`zI$a;|!;liDaGQE|YZ_{ag~ zu`W}XoZ-j2Y$=|c^c|y}^KdrSQtsAq?8i)8IfpJNC0 zC${{d(X_Wwmhde18zC(N;&p^w{b`8A@}mdqsO@}G`L@DGmN)@oJ99F_XPtD|IUId#px zq?Ui$HSnp&qE@%=`^%T6M%A|3WXDAMN5_s{*(B08r(*W46|+}Hj9b~H!4-4dmvL1S zDyLNXOJgVE)h@_Ovr5{j2+jlYL~ehc{B`wde^K0yHjN`0$?>X&ra_Mr9tGXTlYVpP z7x<_9L*p;3C|$O?eMnd{!k=zL11GF&5r4QAH>0}?^S8>n#b22anRXUkW#GLJET<0` zM3nGQZopFR^D_L8rS!6^lAOQou$!yh{%=y+#b?7L%z4C=y_xOdKjklK+S#e8wIlsW zYg24~Snv-WLT30w*CwjrPU=f`yZF&?-3Z2jv0xmy$zPr}TowDbrge6XbPNfvJ<~B{ zd&ugYc4F8F5*Y43m^8^>b9JH`yrSsoM(gnUHTVr!uWDoRLOxZsDS07B)r!*e{|{&M BDrNux delta 32322 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