From 0eacd1bfe277aee630e920dbb4dba7b1f42b00cb Mon Sep 17 00:00:00 2001 From: rfi Date: Sun, 8 Oct 2023 21:12:01 +0700 Subject: [PATCH] GameServer + packet types, we aren't parsing yet --- AscNet.Common/AscNet.Common.csproj | 1 - AscNet.Common/Database/Account.cs | 2 +- AscNet.Common/Util/Crypto.cs | 77 +++++++++++++++++++++- AscNet.GameServer/AscNet.GameServer.csproj | 17 +++++ AscNet.GameServer/Packet.cs | 76 +++++++++++++++++++++ AscNet.GameServer/Server.cs | 54 +++++++++++++++ AscNet.GameServer/Session.cs | 65 ++++++++++++++++++ AscNet.sln | 6 ++ AscNet/AscNet.csproj | 1 + AscNet/Program.cs | 12 +++- 10 files changed, 306 insertions(+), 5 deletions(-) create mode 100644 AscNet.GameServer/AscNet.GameServer.csproj create mode 100644 AscNet.GameServer/Packet.cs create mode 100644 AscNet.GameServer/Server.cs create mode 100644 AscNet.GameServer/Session.cs diff --git a/AscNet.Common/AscNet.Common.csproj b/AscNet.Common/AscNet.Common.csproj index 73ad7b0..f3cf9a7 100644 --- a/AscNet.Common/AscNet.Common.csproj +++ b/AscNet.Common/AscNet.Common.csproj @@ -8,7 +8,6 @@ - diff --git a/AscNet.Common/Database/Account.cs b/AscNet.Common/Database/Account.cs index 521fba3..9277dc2 100644 --- a/AscNet.Common/Database/Account.cs +++ b/AscNet.Common/Database/Account.cs @@ -33,7 +33,7 @@ namespace AscNet.Common.Database public static Account Create(string username, string password) { if (collection.AsQueryable().FirstOrDefault(x => x.Username == username) is not null) - throw new ArgumentException("Username is already registered!", "username"); + throw new ArgumentException("Username is already registered!", nameof(username)); Account account = new() { diff --git a/AscNet.Common/Util/Crypto.cs b/AscNet.Common/Util/Crypto.cs index adb2b28..6625bbb 100644 --- a/AscNet.Common/Util/Crypto.cs +++ b/AscNet.Common/Util/Crypto.cs @@ -1,4 +1,6 @@ -namespace AscNet.Common.Util +using System.Security.Cryptography; + +namespace AscNet.Common.Util { public static class Crypto { @@ -11,5 +13,78 @@ return encryptedData; } + + public static class HaruCrypt + { + private static readonly byte[] key = new byte[] { 103, 40, 227, 236, 173, 175, 148, 243, 66, 252, 58, 22, 68, 192, 159, 15, 187, 15, 15, 29, 209, 209, 212, 66, 104, 16, 252, 194, 227, 14, 116, 112, 196, 221, 5, 1, 4, 173, 165, 69, 45, 193, 95, 10, 67, 38, 167, 239, 96, 184, 133, 75, 152, 196, 36, 121, 251, 7, 73, 82, 219, 25, 118, 70, 153, 232, 120, 120, 147, 10, 88, 106, 214, 187, 216, 49, 224, 57, 1, 233, 110, 40, 65, 85, 246, 197, 4, 20, 56, 74, 245, 41, 63, 169, 188, 104, 89, 49, 115, 254, 100, 77, 79, 11, 148, 242, 95, 88, 241, 111, 48, 130, 169, 200, 224, 135, 121, 161, 72, 84, 5, 100, 135, 70, 141, 94, 244, 114, 58, 28, 87, 181, 205, 221, 154, 184, 197, 98, 210, 202, 252, 124, 144, 9, 112, 163, 24, 254, 119, 188, 5, 230, 40, 79, 171, 17, 156, 212, 134, 41, 79, 134, 26, 251, 123, 219, 191, 136, 21, 84, 192, 91, 24, 33, 68, 101, 85, 61, 186, 215, 191, 37, 45, 51, 117, 227, 14, 145, 56, 43, 32, 67, 48, 98, 192, 41, 136, 223, 50, 163, 97, 251, 174, 59, 59, 147, 237, 177, 31, 159, 52, 243, 245, 247, 148, 139, 21, 92, 139, 80, 47, 4, 105, 59, 227, 220, 180, 231, 176, 187, 205, 203, 148, 121, 98, 90, 87, 131, 245, 3, 63, 239, 57, 117, 102, 134, 40, 172, 60, 128, 108, 102, 216, 247, 133, 102 }; + private static readonly RSACryptoServiceProvider rsa = new(); + private static readonly byte[] signature = new byte[128]; +#pragma warning disable SYSLIB0021 // Type or member is obsolete + private static readonly SHA1 sha = new SHA1CryptoServiceProvider(); +#pragma warning restore SYSLIB0021 // Type or member is obsolete + private const string PUBLIC_KEY = "kZE/f0ifi0DH3uP3KCWOPqTyQ3MsQKHf9X4Z65S36s226RkdkZL2kHTz20n+IlOvGChi3ByDMFLawlyB0MCW94WDnc1Mc/PtVKo6D8gBEcSvdjDbhC4Ly0f2hMHS/SNdGPMAMkEWGNvIvfuT1TEaWTPsxRLZbfASp2KPG7Wjdck=AQAB"; + + static HaruCrypt() + { + rsa.FromXmlString(PUBLIC_KEY); + } + + public static void Encrypt(byte[] content) + { + Encrypt(content, 0, content.Length); + } + + public static void Encrypt(byte[] content, int offset, int count) + { + int num = count % key.Length; + for (int i = 0; i < count; i++) + { + int num2 = i + offset; + int num3 = (int)content[num2]; + num3 ^= (int)key[num]; + if (i > 0) + { + num3 ^= (int)content[num2 - 1]; + } + num3 ^= (int)key[i % key.Length]; + int num4 = ((int)((i + 1 < count) ? content[num2 + 1] : 0) + count) % 8; + num3 = (num3 << 8 - num4 | num3 >> num4); + content[num2] = (byte)num3; + } + } + + public static void Decrypt(byte[] content) + { + Decrypt(content, 0, content.Length); + } + + private static void Decrypt(byte[] bytes, int offset, int count) + { + int num = count % key.Length; + for (int i = count - 1; i >= 0; i--) + { + int num2 = i + offset; + int num3 = (int)bytes[num2]; + int num4 = ((int)((i + 1 < count) ? bytes[num2 + 1] : 0) + count) % 8; + num3 = (num3 >> 8 - num4 | num3 << num4); + num3 ^= (int)key[i % key.Length]; + if (num2 > offset) + { + num3 ^= (int)bytes[num2 - 1]; + } + num3 ^= (int)key[num]; + bytes[num2] = (byte)num3; + } + } + + private static bool Verify(byte[] content, ref int offset, ref int count) + { + Buffer.BlockCopy(content, offset, signature, 0, signature.Length); + offset += signature.Length; + count -= signature.Length; + byte[] hash = sha.ComputeHash(content, offset, count); + return rsa.VerifyHash(hash, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); + } + } } } diff --git a/AscNet.GameServer/AscNet.GameServer.csproj b/AscNet.GameServer/AscNet.GameServer.csproj new file mode 100644 index 0000000..3e74e27 --- /dev/null +++ b/AscNet.GameServer/AscNet.GameServer.csproj @@ -0,0 +1,17 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + diff --git a/AscNet.GameServer/Packet.cs b/AscNet.GameServer/Packet.cs new file mode 100644 index 0000000..e00a159 --- /dev/null +++ b/AscNet.GameServer/Packet.cs @@ -0,0 +1,76 @@ +using MessagePack; + +namespace AscNet.GameServer +{ +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + [MessagePackObject(false)] + public class Packet + { + [Key(0)] + public int No; + + [Key(1)] + public ContentType Type; + + [Key(2)] + public byte[] Content; + + public enum ContentType + { + Request, + Response, + Push, + Exception + } + + [MessagePackObject(false)] + public class Request + { + [Key(0)] + public int Id; + + [Key(1)] + public string Name; + + [Key(2)] + public byte[] Content; + } + + [MessagePackObject(false)] + public class Response + { + [Key(0)] + public int Id; + + [Key(1)] + public string Name; + + [Key(2)] + public byte[] Content; + } + + [MessagePackObject(false)] + public class Push + { + [Key(0)] + public string Name; + + [Key(1)] + public byte[] Content; + } + + [MessagePackObject(false)] + public class Exception + { + [Key(0)] + public int Id; + + [Key(1)] + public int Code; + + [Key(2)] + public string Message; + } + } +#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. +} diff --git a/AscNet.GameServer/Server.cs b/AscNet.GameServer/Server.cs new file mode 100644 index 0000000..b424098 --- /dev/null +++ b/AscNet.GameServer/Server.cs @@ -0,0 +1,54 @@ +using System.Net.Sockets; +using System.Net; +using AscNet.Common.Util; + +namespace AscNet.GameServer +{ + public class Server + { + public static readonly Logger c = new(nameof(GameServer), ConsoleColor.Cyan); + public readonly Dictionary Sessions = new(); + private static Server? _instance; + private readonly TcpListener listener; + + public static Server Instance + { + get + { + return _instance ??= new Server(); + } + } + + public Server() + { + listener = new(IPAddress.Parse("0.0.0.0"), Common.Common.config.GameServer.Port); + } + + public void Start() + { + for (; ; ) + { + try + { + listener.Start(); + c.Log($"{nameof(GameServer)} started and listening on port {Common.Common.config.GameServer.Port}"); + + for (; ; ) + { + TcpClient tcpClient = listener.AcceptTcpClient(); + string id = tcpClient.Client.RemoteEndPoint!.ToString()!; + + c.Warn($"{id} connected"); + Sessions.Add(id, new Session(id, tcpClient)); + } + } + catch (Exception ex) + { + c.Error("TCP listener error: " + ex.Message); + c.Log("Waiting 3 seconds before restarting..."); + Thread.Sleep(3000); + } + } + } + } +} \ No newline at end of file diff --git a/AscNet.GameServer/Session.cs b/AscNet.GameServer/Session.cs new file mode 100644 index 0000000..64dd1a3 --- /dev/null +++ b/AscNet.GameServer/Session.cs @@ -0,0 +1,65 @@ +using System.Net.Sockets; +using AscNet.Common.Util; + +namespace AscNet.GameServer +{ + public class Session + { + public readonly string id; + public readonly TcpClient client; + public readonly Logger c; + private long lastPacketTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + // private ushort packetNo = 0; + + public Session(string id, TcpClient tcpClient) + { + this.id = id; + client = tcpClient; + c = new(id, ConsoleColor.DarkGray); + + Task.Run(ClientLoop); + } + + public async void ClientLoop() + { + NetworkStream stream = client.GetStream(); + byte[] msg = new byte[1 << 16]; + + while (client.Connected) + { + try + { + Array.Clear(msg, 0, msg.Length); + int len = stream.Read(msg, 0, msg.Length); + + if (len > 0) + { + lastPacketTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + + } + + } + catch (Exception) + { + break; + } + await Task.Delay(10); + // 10 sec timeout + if (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - lastPacketTime > 10000) + break; + } + + DisconnectProtocol(); + } + + public void DisconnectProtocol() + { + if (Server.Instance.Sessions.GetValueOrDefault(id) is null) + return; + + c.Warn($"{id} disconnected"); + client.Close(); + Server.Instance.Sessions.Remove(id); + } + } +} diff --git a/AscNet.sln b/AscNet.sln index 9e372d8..f9c7676 100644 --- a/AscNet.sln +++ b/AscNet.sln @@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AscNet.Common", "AscNet.Com EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AscNet.SDKServer", "AscNet.SDKServer\AscNet.SDKServer.csproj", "{B5040F93-BA7F-4E76-AF54-E3FAA857A5DA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AscNet.GameServer", "AscNet.GameServer\AscNet.GameServer.csproj", "{EB20C0CB-7CA1-459F-8410-7A27CC99F98C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {B5040F93-BA7F-4E76-AF54-E3FAA857A5DA}.Debug|Any CPU.Build.0 = Debug|Any CPU {B5040F93-BA7F-4E76-AF54-E3FAA857A5DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5040F93-BA7F-4E76-AF54-E3FAA857A5DA}.Release|Any CPU.Build.0 = Release|Any CPU + {EB20C0CB-7CA1-459F-8410-7A27CC99F98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB20C0CB-7CA1-459F-8410-7A27CC99F98C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB20C0CB-7CA1-459F-8410-7A27CC99F98C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB20C0CB-7CA1-459F-8410-7A27CC99F98C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AscNet/AscNet.csproj b/AscNet/AscNet.csproj index c039af7..cac4759 100644 --- a/AscNet/AscNet.csproj +++ b/AscNet/AscNet.csproj @@ -8,6 +8,7 @@ + diff --git a/AscNet/Program.cs b/AscNet/Program.cs index c264a0c..d37dc5e 100644 --- a/AscNet/Program.cs +++ b/AscNet/Program.cs @@ -1,5 +1,7 @@ -using System.Runtime.InteropServices; -using AscNet.Common.Util; +using AscNet.Common.Util; +using AscNet.GameServer; +using MessagePack; +using Newtonsoft.Json; namespace AscNet { @@ -8,6 +10,12 @@ namespace AscNet static void Main(string[] args) { Logger.c.Log("Starting..."); + + byte[] test = Miscs.HexStringToByteArray("c9000036a163d20000d083f163930202c5d07d92ab4e6f746966794c6f67696ec5d06dde0019aa506c6179657244617461de001da24964ce00fd0cdca44e616d65a3726669a54c6576656c1ca45369676ea0ad446973706c6179436861724964ce000fbb5ba8426972746864617982a34d6f6e0ba344617908aa486f6e6f723900f02601a85365727665724964a435303030a54c696b657300aa437572725465616d496401b04368616c6c656e67654576656e74496400b21e00c048656164506f7274726169749400448ab3d1af1800904672616d65496400ab1100504d6564616c3600f11c417070656172616e636553686f775479706500b54461696c795265636569766547696674436f756e7400bb1700ff0d4163746976656e65737352657761726453746174757300bc5765656b1e0006f0b5a54d61726b73dc003505cd28a1cd2841cd05ddcd0578cd0579cd057acd057bcd057c0166cd01f7cd01f9cccccd0191cd28a2cd28a6cd03e9cd03eacd0708cd28a4cd28abcd28aacd28a3cd28a9cd28a8cd0641cd2776cd28a769cd0321cd0322cd025ace0001aa91cd07d1cd06a5cd0515ce0001aa92cd03ebcd0516cd2855cd0517cd1770cd28c3cd28c0cd27dccd070ace0001a9c9ce0001aa2dce0001aaf5ce0001ab59ce0001abbdcd28c2a9477569646544617461dc002bce000186a1ce000186a20a00f7bea3cdc350cdc3b5cdc3b6cdc3b7cdc419cdc41acdc41bcdc47dcdc4e1cdc545cdc5aacdc5abcdc60dcdc670cdc671cdc673cdc6d5ce00030d41cdc6f3cdc739cdc79dcdc801cdc865cdc8c9cdc92dcdc9f5cdcabdcdcb21cdcb3fcdcb85cdcc4dcdccb1cdcd15cdcd79cdc991cdcf0dcdce41cdcfd1ce000445cbcdcd7aae436f6d6d756e69636174696f6e73dc001d65666768016902036f6a04056b6c060708096d0a0b700c6e0e0f101913ae53686f774368617261637465727390ae536869656c6446756e634c69737490b5fa01f002657474696e67496e666f86a95469746c6508022501ad3e00010f0081ab46617368696f6e0d0078b1576561706f6e1300a1ad446f726d69746f7279220015ab0f00f109496400aa43726561746554696d65ce60fa7d32ad4c6173744f03011300b0651fee6aaa5265706f72741000b200ae4368616e67654e616d3300c06463353ea5466c61677300b72100f0004c696d69744374726c436f6e666967d000c2dc023983a2496417a9537461460090ce5cc6cb20a7456e64320050ce61558a642100171a21004563c8ea702100407242fce42100181b2100357211a021004063844050210017182100455d4b6600210040709c908021001719210036601bc54200042100171c210045651bbbf04200406f2804a042001f1d210005406524f634210017492100445f9f9250420010001d00184d1d0025e17d1d0041ce60333ac2001863210025bf362100013e00187b1d002afbdb1d0027cc871e0049603c74d0790028cc881e002b3dc63c0018891e002b4ee93c00188a1e003a6edb285a00178b1e004a615591a81e00188c1e002b962b3c00188d1e002bcd8a1e0018c91e002b0f6496001fca1e000a1fcb1e000a1fcc1e000a1fcd1e000a1fce1e000938cd012d1f002a8ca3690137cd01f41f00365f308ea30240655166c423023fcd01f52300054260e24b44230017f62300446330eb80740143ce633a25460018f72300271e7623002327b0230017f823003f651a088c00002703782300355f24f6830152ce600578408c0017fe23003665123bd80331654c3cb70337cd01ff23003663feb177033165e136560337cd0258230036651281fd030546002702bc23003a619155690238cd03211f000c6a0238cd03221f00259f5e8400015a0338cd03231f000e3e0018241f000e3e0018251f0025a8990401035d0017261f003c62651f7c0017271f003564ec457504033e0017281f00356295a08401021f002725e61f0035644f47710241ce645730540437cd284b2300355fca08800051ce600e5014c60127277523003664e41623003265123ac6012f27762300053164ed97fb043fcd277723000632f6d1b4690008520209690006460017794600356509461001078c00177a2300094600062300082e053664e5bc010332650aa6470328277c460009230022113d24032f277d2300060546001f7e230006054600187f23002ff8318c000118802300260aff810132643cd2c70128278123000faf0003188223000fc701031883230009460005d20018d923000f4600031fda2300040295022627db1f0007570423112f050216dc1f000a610000ff0202280218dd230007150352ce64f58070230018de230026f58034044264febaf0230018df230027feba4b022307f5460017e02300366507f5460005af0027283d23003764ed972300220552fa0228283e230027eee86900052300183f23002ff03a460001184023002ff18b460001184123002ff2dd46000117a1230035629843310442ce62a6c44b0227290523003764f6d16900220e8ca4012f290623000f1807230027f8238c00054600180823002ff974690001180923002ffac6460001186923000891023364f974af00186a23000f690003186b230008460006af001fcd2300053364fc1769001fd723000f18d8230026e5aed20006460009630326e6ff18010623000963032fe8514600010767034fce64e9a2460001096b032feaf44600010f6b030705f50018ded20008020306af00096b03080203062300086b03090203052300282a31690009a40104fc05292a3a2300165cf50005fc052f2a3b230005056004282a3c23000f600402192af7030f600402192af7030f600402182af7030c600402a604182af7033f65112fd200011795af003665000cc70106f50018f923002713e178052238cace06282afa23000fac0902282afb2300272504ab062249ee3707282b0223000fac09022f2b03230006221a6a7805282b042300271a6ad2002223a41801182ba604376523a41801232cdf460008a60437652cdf4600233619460008a604376536194600233f54460008a60437653f54460023488e460008a6043765488e460004e70a282b5dd2002f4348230001185e23002724f669002233766004282b5f23002713d246002328ea2300176023004562cfe920ff0bb862d8dd1483a24964cd2b61230026d8dd160a4262e75d9423001862230027eb52230023f9d22300088f0e0f23000417c246000aff0b2249e01c07282bc32300351489c0af00426521b8848c0018c423002726fe230023342d230018c5230027397323002246a22300282c2523000f3b0102182c8b0b0f230004080d0f0ad20004ea01282ced69000f4803022f2cee230004022109262cef1f0007a90331473d341001262cf01f000b6100221d0db402282cf12300271d0d4b02232799230018f223002727992300233225230018f323002732252300233cb1230018f42300273cb1230004af00282d5123000f1001022f2d52230006221bbb6303282d532300087d11326524f68c00282d542300094003232e30460018552300272e30400323376b46001856230027376bd2002340a5460017b523000cfa0211d0a401182e4d120a7005222f82c701182e560e0ad20004ef03182e5a0e0a23002230d3ef03192ed70209f5000546001726af00002e0106630305460008ca0c0ad7022324f6af00187e460009cb0f231bbb8c0008ca0c0af500046506182eca0c0f420603282e816900093b0105460008ca0c0f69000408ca0c0f2300041f8469000f1f8523000f178623003662af0f7b043262afb81407182e7e133662b75637073262b7692911182e83130aea01314cbbb053022730d569000f42060200eb1608df0b3761e29bfe05210784ab0f00250017a24a00376219fa2500252c6e250018a32500273ee425002563cd250018a425002776432500259b2c250018a5250027ada2250025d28b250018a6250026e5012500356309ea250017a7250037631c602500254149250018a825002753bf2500256633250018a925002778a92500259d92250018aa250027b008250025d4f1250018ab250027e767250025f9db250017ac250036640c5125003564313a250018ad25002543b0250001160657ce00155cc7210045626ae4302617316273136b0200250019c8250016652c10406273bc404a02002500083e150a4a00217c4d0f0a00250017ca4a003661a1204a003161aaa115040025001fcb25000621c650170400250017cc250037626a1f4e0821a8154e0800250017c125003661a0699a0e3161de609a0e0025000852083761a201940025df6b03011fc34a00110856083762107994002538066f0017c54a0036624d646f0000c600044d011fc6250011083d0e3662ca5cde004462d397144a00083f163663a560fd073563c887970117cf6f00366310829400356342554a0017d025004662d7ee402b0221e02b561557ce00155cd12500356339617102094a0018d22500274d276f00217079ed06004a0018d32500268c8b050535639fef250018d42500278940de0025927abc0108e6040a2500259bb4030117d64a0036645df24a00336489734a0028205d1b150abe0332d5fd50720137205d294a003663abcd06023363d74eb9003f205d2a250006074a00182b250027ae2a940023efd8c20338205d2c250026d6434d01336409ad08043f205d2d250011173225000f131402004a00183325002609aee101336437d206023f205d342500111835250009191403c814004a0018362500263cd24d01046e1600250018372500274e3c940025743197011f382500111f3925001109cb0f273e6a6f002147a45a1c009400183d4a002747a49701254e3b9701183e250009b900234f47780328205dd10f0a7117235dc7ea0438205d404a00265dc70c04356460b06f0009cc132760b1b9002574316f0018424a00273d18b900257477e1011f4325000d28cd23e2024564db22342f043164e416260138cd232b460036b10080230021d5ea740328cd23de023664b8db3b0b3164d096310628cd23dc023764af5ab100056900182e690009230023b8db46001f8d23000623e30b23001f8e23000630b6f06cfe0338cd238f230036b6f06cd20022b8db0d0c282390230009d20032c02aec46001891230036c02aec460022c215300c282392230026c215760c3364c5704600189e230027c570460023c60a8c001893230027c60a5e0123c965d2001894230027c965d20023cb504600082c123764cb50460023d29f8c001896460027d29f8c0023d48ad2001897230027d48ad20023dbda8c001898230027dbda8c0005a401189923000bea0103af00189a2300098101055e01189b2300095e0105f500189c230009f50005d200189d23000fd2000318be230009af0005f50018bf230009af0005230018c0230009af00052300080a090aa40105230008e10f0a460021d9d0770928cd23e10f0a460004230018240f0f0a8e0322c75b46002824b9af0009f50004b1032f24ba23000401f60636cd24bb1f000715070405022624bc1f000b61000405022824bd230009560122c367280219249c0127c367d70223cdf3230018bf460027cdf3230023d87f2300099c0127d87f230004af0028251d46000f1001022f258123000f1fe523000622c21579012825e723000f7005022f25e823000f1fe923000631e31944c1042f25ea23000604d905282649230009f5000418012f264a23000604b6051926e00c27afa03504044b022926ae460008230022b4e67b042826af230027b4e6460022be21c7012826b0230027be21c70123c75b460018b1230027c75b460023d096460018b2230027d096460023d9d0460018b3230027d9d0460023e30b460018b4230027e30b460004f500191fc50727a666230022af5a7d07281f434600278c167d0722ae5dc701281f442300278a705a0705460008f50e0f23000408f30e0f23000408f10e3f6493f1af000118ac8c00279d2b1801058c00090d020f8c0003090d020f690003090d020f690003090d020f690003090d020f690003090d020f690002182005180a3b01229694950828200a18012796943b0122a271f70328200b230027a2713b0123ae4f4600180c230009d2000523001f6d2300060481012f20d123000f1fd223000402d9051720f50d07d90505840008ef0d0a100122914e1d031820ed0d3764914e10012297e563031920eb0d2797e51001239e7d460009751d279e7d460023a666230009751d09630305af0009751d095601239d2b9c011fda100104003502029c011921280d09d20023a909230009260d096e0205230009240d09280205230009220d279937f50005230009200d2f9bda23000109d40c278ab65e010428021921d20c092300228ffca4011921d00c278ffc460022993781011921ce0c09af0023a271460009070509fa0223abac460009070527abacd20005af0009540a0f2a05021921540a0f2300022823a0ea0109f106048209281b59230027817c8c00228a70b605281b5c230009a7102182dbcc1028cd1b171c37645c4ce60d0546001f6146000e281c2123002771aa8c002289657602181cca16376461d82300227ae4df02181cca160a2300237993460008ca1637646b12ea0105460008ca160a230005460009950809f50023744d690018ead200276040ce0605230018eb23002764353b01042300181dcc1937645de3af00045e01281d5746000923002261d87602181d7f280a1801226b12bc02191d0d0209180123744d4600185a690027744d8101237d874600185b2300277d87af002386c246000953022786c2460005d20008011e0f530203191d530209810105460008011e376465cc8c0005230008011e3f646f078c00011864d2002f7841460001186523000f480302281d672300265e9a5e1441646a7804c50a281d682300266d1bf014326478f8011e281d692300277b9b4600238779460009e60709b10303581428cd1e80283764671ef500227ed9bc02191e802827686ff5000523000980282f69c1460001098028095302054600187dd2002f6c6446000108b61b0aa40105460018df4600090d02226f07d2001917012a27311fee07225608c9041917cb072733b3f50023477a460009cb0727477aaf00225b4083041918b306272f79d403215c4b1a1329cd182a1107230002950826189fce0007a70005610016a31f000b84002250b486032818a423002750b4ca0004460028190123002740e2230022589dca002819022300274234ed00052300180323002f44d72300010808230a3301054600180546002f4a1d4600010808233f644cc0230001180746002f4f63230001180823002f520623000109030b2f438518010109030b0fd2000309030b2f4b6e46000109030b0faf0003180daf002f5357460001186e23002731102300046e022f196f2300062233b33002281970230009fa02223ceeb6052819712300273cee3b012346284600187223002746288c00234f634600187323000bf5000346001874230027589d460005d20018c9230007400343ce6438f9bc0218ca230009ef03225b4eef032819cb2300094600224234ef031819cd1a0f46000408cb1a0a23000458042819d06900273656d200048e03191a5416098c00047b04191a54160f230003182f69002730ca72080546001830230027321c9e04052300183123002f336d460001183223002f3610230001183323002f376269000109771609b60522671e8101180fce063763feb1690022116cea01270e1169003663df535e013263e88e4600280e12230026e0a5bc02062300181323002fe1f6460001181423002fe348460001181523002fe499460000180fa90f3663c53ce6073263d224d2002807e1460027a551460022b7c6230018270d0237632ffc8c00214a5af500084d0836600e50c81a406014e7d07008084b08275e0bde23315e13ca880608712c3660178ae21931601e22e51a176ba700005600053618002e00006300726ca953746172747b372720c5840021275c8400186d210027275c63002129ff210008de04376029ff21002130978400176f42000fc600021f7621000d1f7721000d089e24365e0c27c600315f87d7840017264200365f51c9a500315f76b3c600089703375f6c27210021bf364200174242003662d110ce013162f9eef1011843210026c39b4d033162e8cbef01083a133662cd1b33020421001845420027d6566300034200184621002edf9042001864210027cfbe210021eb6e8400176521004660090b04100287128b2083a249646621000fc600020887060a210003080108850608210001b10216725f00063709044201087906083a0050ce62faf9e49d0008b8330fdf000208360b095c3931603774420008cb0a366024b9e70131602df4e701167ea1004ece62c541a500087d263661ce8e6b023161d7c84a0227cc8043000f85000218ccba170a2200212e3ad40f27cc8244003661ca99a8003261dd0e66001f8622000e08b0120a66002136236600082409365c20bce823315e38fa0d01072209060901315e36571d00081c0908740301e801081609004e00056802315e6f07c000160ebf00075b002169c11d00160f1d0045ce5e3b9d6401015b0017101d00355f75621d0041ce5f8291990016112100065b00315f7e9c5b00086706365f0a985901315f8bcb2100086506096e38042100086306455e49d744db00315f10e9b608086106275f2b2202315f473d63001616a10046ce5f15797801315f3e03c200181e2100272a3ca50021892842001f1f21000401210116201d0007000103090508c311375f30d43e0121449a5b0008a4380a21002143499d0016235f0047ce62664664041278a129074e2a068000041d001f273e000d1f2821000d17292100375f55bec20003e301162a2100068000040002085f200a3e02032101085a093662562ece08316268e9e805085809376259170001215d0c420b08560937626252c705216646400b1634a10047ce626b8c4200216f81420008de15376274c742002178bb420008dc1537627e0142002181f642001837630009c600218347c60008d81508e70010006805071f0f064201043a001f3a5b000d183b2100092102034200183c21002978bbbe0001a606072823078000031d00183e3e00277b5e3e00218452e40518552100278453890721970e5f0049ce0020cec70609840124776a250018f5ca0537625a6988012163a3460148ce0020f5cd053762b01a900025c28f2500178a67093762e8cb4a0025f0b46f0008c63e3762f0b42500035b07006f00188c4a000f88080100250008b92236628acec81b4062f36544e201002500188e4a00092500036f08002500188f2500096f0025e385b90008bf223762d11e6f0021ecce5102004a00084a0c0a4109074a0018926f00099400074a00087f223662fc9172013563217b720108c01136631ae44d01356322cdb900189f6f0026e1d1b9000825001fa0250006212189f10500de0017a82500376333f09400254665940017a925003662fadedc0235634cfd94001faa250006254d0bbc0109740d2758da6f00256b4f6f0017b34a0037634faede0025748a6f0018b42500272a5494000725001fb52500071598940017bc25003662d0ca780334838cb825262ff5bd25001117c6250037637dc4de0025a2aede0018c72500274e5db90021a3b9080400970108a62c0a2500259c25b90018d04a0027b5236f0025c7986f0008c81c0b342b15a36f0018d24a0027b12f750225ba694a0018d3250026a3ba28013563b675970118d4250027afdd940025b9182500080d153763a7f42500074a00080f150f6f0006082c0a37637dd34d0107de0018d894000a250004372c3f20f5d925001108e21c0b6f00064a0018db4a000a720106250018dc250027da0d030125fef7720118dd250027ca4ade0025dcbec20318de250009a41025ec824a0008c5163763cb8de10125de02970108633a0f25000618e16f00094a0025d4c76f0018e2250027abf7c20334feb164c8051fe325000625ef33de0018e4250009030125fdb4090317e525003661f394de00356211e694000855363664116c7201356423e1250017ef4a0036640d784a00356416b2250018f025002727d62500252f785303098226271d4a25002526844a0018f24a00260d86280135641ffbde00086b4436623c16b90034624551bc0119f650172710294a00031a1858ce0020f6036f0009250003a81800250009541709f615253a4b6f0018054a002636569400047714004a001706250036715c2a9400347177d9e10127f60c250037646db54a0024dc73280128f60d2500262a874a0034648a70500217f69b0d0b2500034f1e00940008a30d36645df2530304c31a00250018106f00099400076f00181125000f271f01004a0008330d3764672cb90003921f00250018174a0009250024ae5d060217f61e0d47ce64b252b90003aa26004a0008260d3764b2434d0125cdf3bc0118226f00094a0025d73b9701082e0d0f4a000607320d47ce648ac5940003bd2500940018256f0009250003192d00250008e8120a4a0003422700250018274a00097620072b02182a250026c22494003465123a9d0318f64e0d0a250003c843006f0009af2d25eee84d01041a0a19f65917072100096b0008350d35651675460045ce651fb0930108390d3764f19ab500254c3cb500083d0d0a250003f93700b50008410d0f25000608450d36652504960204a83e004a0017394901376538cb940007250008550d0a5f392540a5be0308590d2765130f1635651bbb2500085d0d0aef392524f62801183d9400096f0003ab3900b90008690d376530d3720103393a00250008b723376533762500f02038cac4b75368617265506c6174666f726d436f6e6669674c697374dc001382a2496400a553646b4964950102030405110012231100309201020e0019140e0019170e0019010e0012020e0010903600120b0c00034400190e0e0019100e00190f0e0019180e0019460e00122e0e00016000125e0c0003600019450e00190d0e0012120e001094df00009a0022cc881100033b0012380e00011f0052a84974656d1a01212c87df00015551f506ce000c9ca7a842757954696d657300ad546f74616c0f0053ab4c6173740e009000ab526566726573682a005cce60fa7d32544f005700120257001f00530038120353001f1e530038120453002fccaf5400204f65222620fa0001120c54001f325300200f4d0105121153001f15530038121553001f63530038121653000fa60039120753001f2fa600222a800a9f0120800a990232cd753b55001f2755003a123c55001f175500231ba2aa0011a2aa00229cae55001f0755003852ce00016f3857000f9c03230fac000422c35055002fccfaad003b225f9158001f0157003832cdc35155000f020139121453000f9e04232a85b601022085b60102120d53000fa600232a8a045300208a04530023cd02f0050f5500232a8ba35500218ba355002f9cb1aa00290f55000422753d55001f08fa01220f5500042201f755001f0a550039229cb255001f0555003913029c061f025500222a8e4ea901218e4ea901220200aa000f4e03230f550005120555000faa003a2201f855000fa802230faa000352ce00015f9e57000f01013a229ca855001f13ab01222a9164ab01219164ab01229ca755000faa02232aa84c550020a84c5500121c53002fccc8a900222aaeca540020aeca540032cd9ca456001f0b5500231bf3550010f3550052ce0001637857000f0102232ab0fc570020b0fc570032cd01f555001f06ac00222ac7ba550020c7ba5500005602129f57000fac00230f5700070300080fad022148646334dbae0000100004ae0012afae000f5700232a38d757003138d787755e230177a00b0f05012148651fa7e4570000100000570032cd01f6ac000f0603214a651fa815550021a815550022c35555000faa000638cd0384f20c59ce651fa934f60c4b651fa8195b0011195b00220fa95b001f0161022039651fa8b60500100000550052ce00015f9257000f6305210047000bac00030d061f1a5500292aa936550020a936ac0032cd01f955000fb101232aee79550030ee79afaf0ec052656379636c6544696374820e0122ae91911643015faeab1c00018d0e536538bcf0ac1100017f0e1001240015af2e001aaf2e003a3225702e00a0ad436861726163746572210f4197de0010db02f40e0f9449a54c6576656c0ba34578704ca75175616c69747901ab496e69740d00f004a45374617200a5477261646503a9536b696c6c4500219882430032018ed54300016f1000100012da1000140120001bdf100012e4100005300012e510000530001be610001be9100013eb100085b0456e68616e636592002390a93f5f008800385ec235720100810ea1a754727573744c7601a809008045787000a7416269f200f501cd0158aa4c696265726174654c7601b12f014048656164b55f2082ad0a000560002700af0f00555479706500530122bb5ba000101c530134cd0113550118035501180355011604550113995501229385450014061000128a100001e2115bce0001938f10001294100005300012951000053000129610001404500012991000052000129b1000052000129a10000f65010c3a60499d65012f81426501092f06d56501361259a000100565011407630118016301110163011202b8021602630104b8022292bd43000478022b92c210001bc710001bcc10001bcd10001bce10001bd1100013d310000f53010c2a48d553012f833e5301082fccf5520134331009799f000052011f00520108030a041e015201239a8d43000365022b9a9210001b9710001b9c10001b9d10001b9e10001ba1100013a310000f52010b2963562d074f60fa8b8c5201091fb9520134320fbb5a9f001016520134cd014654011802a6021102a6021201a6020f09040112214500130354012293261000043e052b932b100012301000053000123110000530001232100004f602229335100005200012371000052000133610000f64010b3a604939b6022f8ba36401083fcd02dd65013522944aa000121965011fae650122228f394500040e052b8f3e100012431000041e05228f481000053000034607051000039500053000124d3000051000124f1000046501238f4e10000fd3060d1a9965012f8e4e6501092f03a465013523e26aa000006501051c040fc802070f1c0400239709430003c8022b970e10001b1310001b1810001b1910001b1a10001b1d1000131f10000f53010b3a61cf7553012fc7ba5301082fccfb52012c60a945717569703e09f002dc004b8ca2496402aa54656d706c617465d707452e6ad1ab7a0800110005a009027a01f009ac427265616b7468726f75676800ad5265736f6e616e6365a1085090b8556e631d1a4a726d65641a00a0ad4177616b65536c6f747a009a90a649734c6f636bc2f90053800aa94973620a10c29b0019099b003b2dfd759b0004e808017a03190a9b001f019b002c1bc39b001ba29b00190a9b003f2e72a59b0004101e3601191e9b001f029b004c1a0e9b002b1cb19b000fd101572b82213601190f9b003f2df5a19b00671b419b0019129b003b1f01819b0004ef090f07034f2b833e9b001a179b002c09519b0003ef0b10236c020a07031f036c022c0ba2032b86569b0019359b003b1ee2429b00041c0710149b00192807030f3d043c2b89599b0019399b003f2dfd719b00040fd1014f2b8a2b9b00193a9b002d2e72070303bd070f9b0060193d9b003a1f538936010ba40b0fd101492b8b8c3601193e9b00382ec0c29b0013006c070068020f97004b1ba397001f3f9700090040070fcd01560d9b0019409b00381f05693201071f0c100f36011f1e36015a19479b00382e6eb99b000fcd01561c8cd0041a489700284f7a9700003201036b0501d7070ad0040f72082d0b6b052b8c5868021a499b002fc4aa9b000401060629ccaace010f73082d0f9c000d1a4a9c002c24819c001f5a9f03552b8c5f370119539b00291f7e9b000f6902562b8e2c97001a54970019cc03060f9700571b349700195597000ec90104cd040fd0074f2b8e4e9b0019569b003b1ede5964020fd70a570d9b00195e9b002d2e99720b0f3601562b913f36011a5f9b002bc0c136010422120f6b084f2b91409b001a609b002824849b000f0303562b914397001a799700284b9197000003060fcc04562ba6e79b002acc809c002f72a49c00662ca8769c0019869c00291f57700b0fcf01562ca9d99800198e9800382e47a934010f9800562cad8098001a9198002f4f809800622caead98001a9298002f95ca9800741b9398001fc99800741a98980028286a980000300403330a01a512191497090f030f3c2caf38cc011a999c002f9d9a9c000401cf0a195a9c000fcf0a3c0e9c0019a89c00292dafd6100f9803562cafd7340119ab9800292e0168080f9800571ce598001aac9800287689cc010f9800681aad98002f72a39800631cf930011aaed8162f01609800622cb0fc980019b298002f2df9c801631cc25f0e2bccb598001f8a3001622cc32a300119b698003f2e20999800630c5c112bccb79800095c050f9003562cc45b300119c798003f2dfd743001622cc7ba980019c99800381f2c7998000de21b098c060f28073c0e9c0019ca9c003b2e99b49c000f260d570e9c0019cb9c000ec8160f9c006919d79c00382ebcd938010f0403562ccb316c021add9800284f7c98000f94155a2ccbe99c0019eb9c00382dfd739c000f3401561dcd980619ee98003f2e47aa9800622ccfc130011af098002f6eba9800622cd02698001af298002fbcda9800631ce498001af69800194f68050f6002562cd34998001af798001fc4880f630e980019fc9800292dab25190f3001571c5130011ffd9800841ffe9800731c5230011fff98008339cd010699003f3bb5292904622bd3d6310139cd010c99002f2da71b19630f9900001a0d99000f1b10642dd41732010a5b233f3c0731cb01620f9900001f0f3201731d193201191099000f3201660e9900191199003f2e4b94cb01631d353201191299003f1f0d399900604d646334de9900191399000f4917634664633728990010c3252839cd011499000f4a146346646338db990001be2839cd011599003f3c2e41cb0162089900033201191699000ff408634d646338f932010aeb263f2e4b9232016046651fa91e9900033201191832013f3be0219900622daa0b9900191999000ffd026346651fee8e990003fd02191a99000ffd02630a990023c3ab3d35078433345ec2358d2c02f834335ec238110012c311003360499d110013c211002a48d511003a63561511003a60493911003a5ec29911003461cf751100c1b048656164506f72747261691e2d1294803782895441a94c6566746c3762a9426567696e5a4a346334bf23001f4223000f1f4323000d3f8ab3d123000752b242617365332ea66f67696e4461746182ad1400c069737490ab4472657373656456016190a946756265270010849c482067653200a1de003cce0098bdf58ea713000083113098bdf52000a072734d61726b07a65061420020c3ae080000e5007873546f6461790010003174616cf9390110019000a553636f726500ac3c4704350059ce60fa7f7e41474a646334bf4147d0800aae426573745265636f72646a002038ae430007100010ab20008043617264496473932c1240490000ab24000b140000c40019f6d2001ff6d200412f81b2d2000c2b8221d2001b30d2001f30d2000001981c0fd6000001180000da0019f7da001ff7da00412f82c2da000c2b8323da001b49da001f49da002119f8da001ff8da00412f8358da000d1ba6da001b3bda001e3bda00009b01105905000fb80100001700021c0058ce0098be59e2002fbe59e200412f8491e2000c2b8511e2001b36e2001f36e20029195ae2001f5ae200412f8556e2000d1b98e2001b2be2001f2be20029195be2001f5be200412f87a0e2000c2b881fe2000f80030a199097021100210529be5cc700028e6e0ff3053c2f8837c7000d1b80c7001b2fa9011f2fa9012919bde2001fbda901412f890ee2000c2b8959e2000f6d033a19bee2001fbee200421fb8e2000d1bece2001b20c4011f20c4012919bfe2001fbfe200412f8a61e2000c2b8a9ee2001b27e2001f27e2002919c0e2001fc0e2001f1f027b090e2f8ce2e2000d1bfee2001b25e2001f2de2001f105afa06685bce0098e505e2002fe505e2001f0f5d0a0f2f8d38e2000c2b8da4e2001b2ce2001f2ce2000302c60009400501790a00dd00021c0000e2001906e200024d580f4c053c2f8f3ce2000c2b8fcae2001b1fe2001d1fe200164ac6000de200071c0000e2001907e2001f07c401412f9084e2000c2b90e4e2001b37e2001f37e200291908e2001f08e200412fa2fde2000c2ba348e2001b34e2001f34e200291969e20002fa6c0fa6023c2fa3eee2000c2ba458e2000fb9080a01e50d078a020fa6020d196ae2001f6ac401412fa48be2000d1bf8e2001b3cc4011f3cc401264601ca8735e200000e0006a90f2000a66c0f0ea90f1f01a90f1e29a527e20000110071aa437265617465e4104b60faa543e2001b14e2001f14e20026480098e56bb90f26e56be2000f8b103729a571e2000e8b102ba5ffe2000fb90f0f0fa60218196ce200021f700f88033c1fa6980a0d1ca67a0b1b3fc4011f3fc401264601c9ed4de200000e0006c4010fa602051b03a6021f03d4080e29d3c3c4010011000aa6022ba6b7c4011b09e2001f09e20026490098e5cda60216cde2000fa6023729a755e2000ea6022ba7b8e2001b45e2001f45e200264601c9edb1e200000e0006e2000fc401050f6a041f29a81ee2000011000ac4012ba84ce2001b22e2001f22e20026490098e5cec40116cee2000fc4013729a882e2000ec4012ba8fbe2001b40e2001f40e2002919cfe2001fcfe200411fa96a040d2ba97ce2000fb609373701c9ebe40f000e0006e2000fa6023729a9abc4010011000aa6022ba9c7e2001b12c4011f12c4012919d0a60216d0e2000fa602371fa9200e0d2baa57e2001b3de2001f3de2002727a800d4084f00a80035e2004129ac1ac4010e88031cac33141b6be2001f6be200291736c4013fa80036e200421fa7e2000d1beac4010fd4080a0f33140039a80037c70002c0630fb9083c2fad0cc7000c1cadb9081b6aa9011f6aa901291938e2001f38a901411faddc150d2bade7a9011b41e2001841e2000fa901021939c7001f39c700421ff0a9010c2bae6ec7001b73c7001873c7000fea0d1a4601c9ec21e200000e0006e2000ff8053729ae8ae2000011000af8052baeade2001b17e2001f17e200264700a8003af80536a8003ae2000ff8053729af79e2000e16052bafc8e2000fcc0e0a0e8b024601cad555c700000e0006c7000fa9013729b033c7000011000aa9012bb0a9c7001b24a9011f24a9012737990c15a90136990c15e2000fa9013729c1a4e2000ea9012bc258e2002bcc93e30028cc93e4000eab014900990c16c9001f16c900411fc2331f0d2bc32ac9001b61c8001861c7000f36041a4900990c17e2001f17e200412fc34dab010c2bc3a3e2000f611e0f0f5c101639990c18e2001f18e200421fdae2000c2bc45be2001b69c4011f69c401291979e2001f79e200412fc46ee2000c2bc506e2002bcc8be3002fcc8be40029197ae4001f7ae400412fc514e4000d1b94e4001b6ce3001f6ce200264601c9edb2e200000e0006e2000f1706051b0522121f0522120e29ca8ee2000011000a17062bc66be2001b1ce2000f32192839990c7b1706167be2000f17063729c724e2000e17062bc786e2001b4ee2001f4ec401264900990c7ce2001f7ce200412fc851e2000c2bc8bfe2001b5ce2001f5ce2002919dde2001fdde200421fefe2000c2bc954e2001b55e2001855e2000fd9070219dec7001fdec700412fc962c7000d1bdbc7001b60c7001860c7000fd9071d19dfe2001fdfe200411fcaf10c0d2bcb31e2001b23e2001f23e2002919e0e2001fe0e200412fcc0ac4010c2bcc44e2001b29e2001f29e2002737a82745e2003fa82745e200412fce75e2000c2bcee3e2001b54e2001f54e200291946e2001f46e200412fcf06e2000c2bcf4ee2001b39e2001839e2000f4f040039a82747c7001f47c700421f5ac7000d1bc1c7001b59c7001859c7000f4f041b39a82748e2001f48e200421fd8e2000c2bd026e2001b46e2001846e2000fa901021949c7001f49c700411ad07c0f0e83082bd075c7001b3ac7001f3ac7000e194ac7001f4ac700420f9d2e0d2bd0e4c7001b51c7001851c7000f70021a4601c9edb3e200000e0006e2000f0e0b051b040e0b1f040e0b0e29d29470020011000a0e0b2bd1e9e2001b16e2000f6c1b28389933250e0b263325e2001f07b820041b00e2000f04260d4964633652e200004c6b08e20000a0360be2000f8308383798bd91e2003f98bd91e2003f00d1000fe2000a0021000be2003bcd01a4c60138cd01a4aa026891ce000f9449582302120000c4001992d2000238860fef173a00b1000fd2001d2bccd2d1002fccd2d000151993d0001f93a201730fd0002411adcd3300ee335844617461854601f10e00ae53656c656374656443686172496400b0557267656e74416c61726da3338274b15765656b6c7918000113004800ae44611000f10580b0556e6c6f636b4869646553746167657390b10800a0446966666963756c74691300018600714d61696e4c696e50349183ac547265617375720e00609fce000f462a0500102b0500602cce000f4a120500101305006014ce0010ccca050010cb050060ccce000f4dfa050010fb050060fcce0010d0b2050010b3050020b4ade933002c040187004086cd03e9513140c0cd03eaa02841d0cd044d2817f104cd03ebce00990ce0cd044ece00a8274acd03ec800410b5a6007243686170746572b2cd616e666f7390bac20004180045787472614d350acb001a9080002490b13400064c0011b44c00025501016300009b012b81af1100a380b04175746f46696768eb34c17390ad5465616d47726f75703200300186a81100605479706501a60a00f106496401aa4361707461696e506f7301ad4669727374420041506f73032d00003900208301cd03214a027a4810030600115b1c00604e616d65a0ae4900605072656661622c006080a95369676e1b64f014739385a2496402a5526f756e6401a344617905a3476f74c2a946696e697368446179002100172a21001f032100011f2b21000973b341737369676e3401e75265636f726490b1576561706f6efa377290ab506172746e886e2290b431cda1656450726f746f636f6cd43685b04c696d69746564a801b0c0af5573654261636b6772810000c33641d59f81b88d01a553686f727453746f72792f000fd70119506e666f7390"); + Crypto.HaruCrypt.Decrypt(test); + Console.WriteLine(JsonConvert.SerializeObject(MessagePackSerializer.Typeless.Deserialize(MessagePack.MessagePackSerializer.Deserialize(test, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4Block)).Content))); + + Task.Run(GameServer.Server.Instance.Start); SDKServer.SDKServer.Main(args); } }