using Hi1Proxy.Properties; using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Threading; using System.IO; using System.Net.Sockets; using System.Drawing.Imaging; using System.Net; using Newtonsoft.Json; namespace Hi1Proxy { class Area { public int start_x = 0; public int end_x = 0; public int start_y = 0; public int end_y = 0; public string name; public Area(int minx, int maxx, int miny, int maxy, string onamae) { start_x = minx; start_y = miny; end_y = maxy; end_x = maxx; name = onamae; } } class TileSetArea { public int MinX = 0; public int MaxX = 0; public int MinY = 0; public int MaxY = 0; public int Tileset = 0; public string Name; public TileSetArea(int minx, int maxx, int miny, int maxy, int tileset, string name) { MinX = minx; MinY = miny; MaxY = maxy; MaxX = maxx; Tileset = tileset; Name = name; } } class Tiles { public int X = 0; public int Y = 0; public int TileID = 0; public bool Overlay; public Tiles(int mX, int mY, int mTileID, bool mOverlay) { X = mX; Y = mY; TileID = mTileID; Overlay = mOverlay; } } class HI1Protocal { private static bool HasTped = false; private static bool WaitMove = false; private const byte PACKET_LOGIN = 0x7F; private const byte PACKET_CHAT = 0x14; private const byte PACKET_MOVE = 0x15; private const byte PACKET_USERINFO = 0x81; private const byte PACKET_SWF = 0x28; private const byte PACKET_SWF_3 = 0x29; private const byte PACKET_SWF_2 = 0x2A; private const byte PACKET_TILEINFO = 0x1E; private const byte PACKET_MOVEMENT = 0x15; private const byte PACKET_BIRDSEYE_MAP = 0x76; private const byte PACKET_TILESET_AREA = 0x79; private const byte PACKET_DISCONNECT = 0x80; private const byte LOGIN_INVALID_USER_PASS = 0x15; private const byte LOGIN_SUCCESS = 0x14; private const byte CHAT_ALL = 0x14; private const byte CHAT_BUDDIES = 0x17; private const byte CHAT_HERE = 0x24; private const byte CHAT_RESP_BLEFT = 0x14; private const byte CHAT_RESP_BRIGHT = 0x15; private const byte MOVE_UP = 0x14; private const byte MOVE_DOWN = 0x15; private const byte MOVE_RIGHT = 0x16; private const byte MOVE_LEFT = 0x17; private const byte MOVE_EXIT = 0x10; public static int giveQuestId = 0; public static bool WaitQuest = false; private static bool hasLoggedIn = false; private static byte[] SecCodeSeeds = new byte[3]; private static int SecCodeInc = 0; private static int SecCodeCount = 0; private static bool IsAdmin = false; private static bool IsMod = false; private static int X = 0; private static int Y = 0; private static bool STOPIT = false; private static int WalkToX = 0; private static int WalkToY = 0; private static int Facing = 0; private static bool inProgress = false; private static List tileSetAreas = new List(); private static List tiles = new List(); public static Bitmap MapData = new Bitmap(1000, 500, PixelFormat.Format24bppRgb); public static Bitmap oMapData = new Bitmap(1000, 500, PixelFormat.Format24bppRgb); public static Socket HI1Server; public static Socket Hi1Client; public static String DecryptLogin(string encpass) { string decrypt = ""; string ROTPOOL = "bl7Jgk61IZdnY mfDN5zjM2XLqTCty4WSEoKR3BFVQsaUhHOAx0rPwp9uc8iGve"; string POSPOOL = "DQc3uxiGsKZatMmOS5qYveN71zoPTk8yU0H2w9VjprBXWn l4FJd6IRbhgACfEL"; string ROTPOOL2 = "evGi8cu9pwPr0xAOHhUasQVFB3RKoESW4ytCTqLX2Mjz5NDfm YndZI16kgJ7lb"; int i = 0; int ii = 0; while (i < encpass.Length) { int ROT = ROTPOOL.IndexOf(encpass[i].ToString()); int POS = POSPOOL.IndexOf(encpass[i + 1].ToString()); POS -= (ROT + ii); if (POS < 0) { POS = (POS / -1) - 1; while (POS >= ROTPOOL.Length) { POS -= ROTPOOL.Length; } decrypt += ROTPOOL2[POS]; } else { while (POS >= ROTPOOL.Length) { POS -= ROTPOOL.Length; } decrypt += ROTPOOL[POS]; } i += 2; ii += 1; } return decrypt.Replace(" ", ""); } private static void DecodeMovementPacket(byte[] Packet) { //Console.WriteLine("DEBUG: "+BitConverter.ToString(Packet)); byte movement_direction = Packet[1]; switch(movement_direction) { case MOVE_UP: Console.WriteLine("Move up!"); break; case MOVE_DOWN: Console.WriteLine("Move down!"); break; case MOVE_LEFT: Console.WriteLine("Move left!"); break; case MOVE_RIGHT: Console.WriteLine("Move right!"); break; case MOVE_EXIT: Console.WriteLine("Exit this place!"); break; default: Console.WriteLine("Move unknown! " + movement_direction); break; } } private static void DecodeLoginResponsePacket(byte[] Packet) { byte login_resp = Packet[1]; switch (login_resp) { case LOGIN_INVALID_USER_PASS: Console.WriteLine("Invalid username / password!"); break; case LOGIN_SUCCESS: Console.WriteLine("Login success!"); hasLoggedIn = true; break; default: Console.WriteLine("Unknown login code: " + BitConverter.ToString(Packet).Replace("-", " ")); break; } } private static void DecodeLoginRequestPacket(byte[] Packet) { if(!hasLoggedIn) { string encryptedPassword = Encoding.UTF8.GetString(Packet).Substring(1); string[] loginParts = encryptedPassword.Split('|'); int Version = int.Parse(loginParts[0]); string EncryptedUsername = loginParts[1]; string EncryptedPassword = loginParts[2]; string Username = DecryptLogin(EncryptedUsername); string Password = DecryptLogin(EncryptedPassword); Console.WriteLine("Version: " + Version); Console.WriteLine("Username: " + Username); Console.WriteLine("Password: " + Password); } else { Console.WriteLine("Get user information."); } } public static bool ParseHi1ResponsePackets(byte[] FullPacket) { return ParseServerResponsePacket(FullPacket); byte split = 0x00; List result = new List(); int start = 0; for (int i = 0; i < FullPacket.Length; i++) { if (FullPacket[i] == split && i != 0) { byte[] _in = new byte[i - start]; Array.Copy(FullPacket, start, _in, 0, i - start); result.Add(_in); start = i + 1; } else if (FullPacket[i] == split && i == 0) { start = i + 1; } else if (FullPacket.Length - 1 == i && i != start) { byte[] _in = new byte[i - start + 1]; Array.Copy(FullPacket, start, _in, 0, i - start + 1); result.Add(_in); } } foreach (byte[] Packet in result) { ParseServerResponsePacket(Packet); } } private static void DecodeChatResponsePacket(byte[] Packet) { byte chatid = Packet[1]; if (Packet.Length <= 4) { return; } string ChatMsg = ""; switch (chatid) { case CHAT_RESP_BRIGHT: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3); Console.WriteLine("BOTTOM RIGHT: " + ChatMsg); break; case CHAT_RESP_BLEFT: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3); Console.WriteLine("BOTTOM LEFT: " + ChatMsg); break; } } private static void CopyPixels(Bitmap sourceBitmapData, Graphics destBitmapData, Rectangle sourceRect, Point destPoint) { Rectangle dstResion = new Rectangle(destPoint.X, destPoint.Y, sourceRect.Width, sourceRect.Height); destBitmapData.DrawImage(sourceBitmapData, dstResion, sourceRect, GraphicsUnit.Pixel); } private static Bitmap DetermineTileset(int MX, int MY) { for (int i = 0; i < tileSetAreas.Count; i++) { if (tileSetAreas[i].MinX <= MX && tileSetAreas[i].MaxX >= MX && tileSetAreas[i].MinY <= MY && tileSetAreas[i].MaxY >= MY) { int tileSetId = tileSetAreas[i].Tileset; switch(tileSetId) { case 0: return Properties.Resources.Overlay0; case 1: return Properties.Resources.Overlay1; case 2: return Properties.Resources.Overlay2; case 3: return Properties.Resources.Overlay3; case 4: return Properties.Resources.Overlay4; case 5: return Properties.Resources.Overlay5; case 6: return Properties.Resources.Overlay6; case 7: return Properties.Resources.Overlay7; } } } return Properties.Resources.Overlay0; } //SELECT DISTINCT X,Y,TILEID FROM MapData WHERE X = 1 AND Y BETWEEN 0 AND 498 public static int GetTileFromDatabase(int x,int y,bool overlay) { if (overlay) return oMapData.GetPixel(x, y).B; else return MapData.GetPixel(x, y).B; } public static void RebuildMapPngFromDb() { Console.WriteLine("Redrawing map from saved db..."); int xx = 0; int yy = 0; int map_width = 997 + 2; int map_height = 496 + 2; Bitmap FULL_BRIDGE_RECTIFIER = new Bitmap(map_width * 32, map_height * 32); Graphics FullMapGraphics = Graphics.FromImage(FULL_BRIDGE_RECTIFIER); while(xx < map_width) { yy = 0; while (yy < map_height) { int beMap = GetTileFromDatabase(xx, yy, false); int beoMap = GetTileFromDatabase(xx, yy, true); Console.WriteLine("X " + xx.ToString()); Console.WriteLine("Y " + yy.ToString()); Console.WriteLine("beMap " + beMap.ToString("X")); Console.WriteLine("beoMap " + beoMap.ToString("X")); if (beMap >= 2) { CopyPixels(Resources.TileSet, FullMapGraphics, new Rectangle((beMap - 2) % 8 * 32, ((beMap - 2) / 8) * 32, 32, 32), new Point((xx - 1) * 32, (yy - 1) * 32)); } if (beoMap >= 2) { if (beoMap - 2 < 192) { CopyPixels(Resources.TileOverlay, FullMapGraphics, new Rectangle((beoMap - 2) % 8 * 32, ((beoMap - 2) / 8) * 48, 32, 48), new Point((xx - 1) * 32, (yy - 1) * 32 - 8)); } else { CopyPixels(DetermineTileset(xx, yy), FullMapGraphics, new Rectangle((beoMap - 194) % 8 * 32, ((beoMap - 194) / 8) * 48, 32, 48), new Point((xx - 1) * 32, (yy - 1) * 32 - 8)); } } yy++; } xx++; } FULL_BRIDGE_RECTIFIER.Save(@"Map-Redraw.png"); } public static void DecodeBirdMapResponsePacket(byte[] Packet) { Console.WriteLine("Decoding Bird Map."); MoveNext(); // Bitmap MapData = new Bitmap(1568, 992); Point MapStart = new Point(X - 21, Y - 15); Graphics MapDataGraphics = Graphics.FromImage(MapData); // Read map data. int beMap = 0; int beoMap = 0; int pixelPos = 1; int relY = 1; int relX = 1; while (relY <= 31) { relX = 1; while (relX <= 49) { if (Packet[pixelPos] == 190) { pixelPos++; beMap = Packet[pixelPos] + 100; // tiles.Add(new Tiles((MapStart.X + (relX - 1)), (MapStart.Y + (relY - 1)), beMap, false)); pixelPos++; } else { beMap = Packet[pixelPos++]; // tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beMap, false)); } if (Packet[pixelPos] == 190) { pixelPos++; beoMap = Packet[pixelPos] + 100; // tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beoMap, true)); pixelPos++; } else { beoMap = Packet[pixelPos++]; // tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beoMap, true)); } // Draw tile int PixelX = MapStart.X + relX; int PixelY = MapStart.Y + relY; if ((PixelX > 0 && PixelX < MapData.Width) && (PixelY > 0 && PixelY < MapData.Height)) { MapData.SetPixel(PixelX, PixelY, Color.FromArgb(beMap)); oMapData.SetPixel(PixelX, PixelY, Color.FromArgb(beoMap)); } /* if (beMap >= 2) { CopyPixels(Resources.TileSet, MapDataGraphics, new Rectangle((beMap - 2) % 8 * 32, ((beMap - 2) / 8) * 32, 32, 32),new Point((relY -1) * 32, (relX - 1) * 32)); } if (beoMap >= 2) { if (beoMap - 2 < 192) { CopyPixels(Resources.TileOverlay, MapDataGraphics, new Rectangle((beoMap - 2) % 8 * 32, ((beoMap - 2) / 8) * 48, 32, 48), new Point((relY - 1) * 32, (relX - 1) * 32 - 8)); } else { CopyPixels(DetermineTileset(MapStart.X + relX,MapStart.Y + relY), MapDataGraphics, new Rectangle((beoMap - 194) % 8 * 32, ((beoMap - 194) / 8) * 48, 32, 48), new Point((relY - 1) * 32, (relX - 1) * 32 - 8)); } } */ relX++; } relY++; } /* try { Bitmap TotalMap = new Bitmap(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png"); Graphics TotalMapGraphics = Graphics.FromImage(TotalMap); CopyPixels(MapData, TotalMapGraphics, new Rectangle(0, 0, MapData.Width, MapData.Height), new Point(MapStart.X * 32, MapStart.Y * 32)); TotalMapGraphics.Dispose(); TotalMap.Save(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMapo.png"); TotalMap.Dispose(); File.Delete(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png"); File.Move(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMapo.png", @"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png"); } catch (Exception) { } */ try { if (File.Exists("MapData.bmp")) File.Delete("MapData.bmp"); if (File.Exists("oMapData.bmp")) File.Delete("oMapData.bmp"); MapData.Save("MapData.bmp", ImageFormat.Bmp); oMapData.Save("oMapData.bmp", ImageFormat.Bmp); } catch(Exception) { } //M Program.mpForm.OpenBitmap(); Console.WriteLine("Saved bird map."); } private static void DecodeTileAreasResponsePacket(byte[] Packet) { string[] AreaCodes = Encoding.ASCII.GetString(Packet).Substring(2).Split('^'); int ti = 0; while (ti < AreaCodes.Length) { if(AreaCodes[ti][0] == 'T') { int minx = ((AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20) + 4; int maxx = ((AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20) + 4; int miny = ((AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20) + 1; int maxy = ((AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20) + 1; string name = AreaCodes[ti].Substring(9); Area area = new Area(minx, maxx, miny, maxy, name); // Console.WriteLine(JsonConvert.SerializeObject(area)); } else if (AreaCodes[ti][0] == 'A') { int minx = ((AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20) + 4; int maxx = ((AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20) + 4; int miny = ((AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20) + 1; int maxy = ((AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20) + 1; string name = AreaCodes[ti].Substring(9); Area area = new Area(minx, maxx, miny, maxy, name); Console.WriteLine(JsonConvert.SerializeObject(area)); } else if (AreaCodes[ti][0] == 'I') { int minx = (AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20; int maxx = (AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20; int miny = (AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20; int maxy = (AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20; int tileset = Int32.Parse(AreaCodes[ti].Substring(9, 1)); string name = AreaCodes[ti].Substring(10); /* Console.WriteLine("Name: " + ); Console.WriteLine("MinX: " + minx.ToString()); Console.WriteLine("MaxX: " + maxx.ToString()); Console.WriteLine("MinY: " + miny.ToString()); Console.WriteLine("MaxY: " + maxy.ToString()); Console.WriteLine("Tileset: " + tileset.ToString());*/ TileSetArea tsetArea = new TileSetArea(minx+4,maxx+4,miny+1,maxy+1,tileset,name); //Console.WriteLine(JsonConvert.SerializeObject(tsetArea)); tileSetAreas.Add(tsetArea); } else { Console.WriteLine("unknown: " + AreaCodes[ti][0]); } ti++; } } private static void DecodeMovementResponsePacket(byte[] Packet) { int newX = (Packet[1] - 20) * 64 + Packet[2] - 20; int newY = (Packet[3] - 20) * 64 + Packet[4] - 20; int charid = (Packet[6] - 20) * 64 + Packet[7] - 20; int direction = Packet[8] - 20; int newFacing = Packet[5] - 20; Console.WriteLine("Movement:"); Console.WriteLine("X: " + newX); Console.WriteLine("Y: " + newY); Console.WriteLine("Facing: " + newFacing); Console.WriteLine("Character: " + charid); Console.WriteLine("Direction: " + direction); X = newX; Y = newY; Facing = newFacing; if(WaitQuest) { giveQuestId++; GiveQuest(giveQuestId); } if(WaitMove) { WaitMove = false; MoveTowards(WalkToX, WalkToY); } if(HasTped) { HasTped = false; byte[] RequestMap = new byte[] { 0x76, 0x0A, 0x00 }; ParseClientRequestPacket(RequestMap); HI1Server.Send(RequestMap); } } private static void MoveTowards(int newX, int newY) { Console.WriteLine("MOVE TOWARDS: " + newX.ToString() + " " + newY.ToString()); if(X == newX && Y == newY) { byte[] RequestMap = new byte[] { 0x76, 0x0A, 0x00 }; ParseClientRequestPacket(RequestMap); HI1Server.Send(RequestMap); return; } MemoryStream ms = new MemoryStream(); ms.WriteByte(PACKET_MOVE); if (X > newX) { ms.WriteByte(MOVE_LEFT); } else if(X < newX) { ms.WriteByte(MOVE_RIGHT); } else if(Y > newY) { ms.WriteByte(MOVE_UP); } else if(Y < newY) { ms.WriteByte(MOVE_DOWN); } ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] Packet = ms.ToArray(); ms.Dispose(); ParseClientRequestPacket(Packet); try { HI1Server.Send(Packet); } catch (Exception) { Console.WriteLine("Huh?"); } WaitMove = true; WalkToX = newX; WalkToY = newY; } private static void AdminTeleportRequest(string x, string y) { MemoryStream ms = new MemoryStream(); ms.WriteByte(PACKET_CHAT); ms.WriteByte(CHAT_HERE); byte[] TpCommand = Encoding.UTF8.GetBytes("%GOTO " + x + "," + y+"\n"); ms.Write(TpCommand, 0x00, TpCommand.Length); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] Packet = ms.ToArray(); ms.Dispose(); ParseClientRequestPacket(Packet); try { HI1Server.Send(Packet); } catch(Exception) { Console.WriteLine("Huh?"); } HasTped = true; } private static void GiveMoneyRequest(int amount) { byte[] SecCode = GenerateSecCode(); byte[] idStr = Encoding.ASCII.GetBytes("puzzle1"); byte[] amountStr = Encoding.ASCII.GetBytes(amount.ToString()); MemoryStream ms = new MemoryStream(); byte[] ByteArray = new byte[] { 0x18, 0x1E, SecCode[0], SecCode[1], SecCode[2], SecCode[3] }; ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x7c); ms.Write(amountStr, 0x00, amountStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); ms.Dispose(); } private static void PawneerOrderHorsePacket(int itemId) { byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString()); MemoryStream ms = new MemoryStream(); byte[] ByteArray = new byte[] { 0x45, 0x34, 0x38, 0x63 }; ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); ms.Dispose(); } private static void WrapItemPacke(int itemId) { byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString()); MemoryStream ms = new MemoryStream(); byte[] ByteArray = new byte[] { 0x1E, 0x17 }; ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); ms.Dispose(); } private static void ReleaseHorseRequest(int itemId) { byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString()); MemoryStream ms = new MemoryStream(); byte[] ByteArray = new byte[] { 0x19, 0x19 }; ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); ms.Dispose(); } private static void GiveItemRequest(int itemId) { byte[] SecCode = GenerateSecCode(); byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString()); MemoryStream ms = new MemoryStream(); byte[] ByteArray = new byte[] { 0x18, 0x28, SecCode[0], SecCode[1], SecCode[2], SecCode[3] }; ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); ms.Dispose(); } private static void GiveQuest(int questId, bool all = false) { byte[] SecCode = GenerateSecCode(); byte[] idStr = Encoding.ASCII.GetBytes(questId.ToString()); byte[] ByteArray = new byte[] { 0x18, 0x32, SecCode[0], SecCode[1], SecCode[2], SecCode[3] }; MemoryStream ms = new MemoryStream(); ms.Write(ByteArray, 0x00, ByteArray.Length); ms.Write(idStr, 0x00, idStr.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packetData = ms.ToArray(); ParseClientRequestPacket(packetData); HI1Server.Send(packetData); } private static void MoveNext() { if(STOPIT == true) { STOPIT = false; return; } int NewY = Y; int NewX = X + 45; if (X == 995) { NewX = 20; NewY = Y + 28; } if (NewX > 995) NewX = 995; MoveTowards(NewX, NewY); } private static void DownloadSwf(string Swf) { Console.WriteLine("Load Swf: " + Swf); if (Swf.Contains("?")) Swf = Swf.Split('?')[0]; WebClient wc = new WebClient(); if (!Directory.Exists("mod")) Directory.CreateDirectory("mod"); if (!Swf.EndsWith(".swf")) Swf += ".swf"; string filename = Path.Combine("mod", Swf); wc.DownloadFile("http://pinto.horseisle.com/mod/" + Swf, filename); Console.WriteLine("Downloaded swf: " + Swf); } private static void DecodeSwfLoadPacket(byte[] Packet) { string Swf = Encoding.UTF8.GetString(Packet).Substring(1, Packet.Length - 2); DownloadSwf(Swf); } private static bool DecodeChatSendPacket(byte[] Packet) { byte chatid = Packet[1]; string ChatMsg = ""; switch (chatid) { case CHAT_ALL: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2,Packet.Length-3); Console.WriteLine("ALL: " + ChatMsg); break; case CHAT_HERE: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3); Console.WriteLine("HERE: " + ChatMsg); break; case CHAT_BUDDIES: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3); Console.WriteLine("BUDDIES: " + ChatMsg); break; default: ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3); Console.WriteLine(chatid+": " + ChatMsg); break; } if(ChatMsg.StartsWith(".")) { string[] commandArgs = ChatMsg.Split(' '); string command = commandArgs[0]; if (command == ".QA") { giveQuestId = Int32.Parse(commandArgs[1]); WaitQuest = true; } if (command == ".Q") { GiveQuest(Int32.Parse(commandArgs[1])); } else if(command == ".M") { GiveMoneyRequest(Int32.Parse(commandArgs[1])); } else if(command == ".I") { GiveItemRequest(Int32.Parse(commandArgs[1])); } else if(command == ".R") { ReleaseHorseRequest(Int32.Parse(commandArgs[1])); } else if(command == ".W") { WrapItemPacke(Int32.Parse(commandArgs[1])); } else if(command == ".PO") { PawneerOrderHorsePacket(Int32.Parse(commandArgs[1])); } else if(command == ".S") { byte[] ByteArray = new byte[] { 0x45, 0x35, 0x32, 0x63, 0x33, 0x0A, 0x00 }; ParseClientRequestPacket(ByteArray); HI1Server.Send(ByteArray); } else if(command == ".PP") { byte[] pingbongball = new byte[] { 0x7c, 0x0a, 0x00 }; ParseClientRequestPacket(pingbongball); HI1Server.Send(pingbongball); } else if(command == ".FT") { byte[] TIlesets = new byte[] { 0x79, 0x5E, 0x41, 0x1B, 0x28, 0x1B, 0x2B, 0x16, 0x4E, 0x16, 0x4F, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2B, 0x17, 0x2D, 0x16, 0x1B, 0x16, 0x1D, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x20, 0x56, 0x69, 0x6C, 0x6C, 0x61, 0x67, 0x65, 0x5E, 0x41, 0x18, 0x4A, 0x18, 0x4C, 0x16, 0x48, 0x16, 0x4B, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x35, 0x1D, 0x38, 0x18, 0x31, 0x18, 0x33, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x18, 0x4D, 0x18, 0x4F, 0x16, 0x4B, 0x16, 0x4E, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x30, 0x1E, 0x33, 0x18, 0x17, 0x18, 0x19, 0x30, 0x53, 0x6F, 0x6C, 0x6F, 0x6D, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x18, 0x43, 0x18, 0x46, 0x15, 0x39, 0x15, 0x3B, 0x52, 0x61, 0x69, 0x6E, 0x79, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x1B, 0x29, 0x1B, 0x2D, 0x16, 0x4C, 0x16, 0x4E, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x26, 0x1B, 0x2A, 0x16, 0x50, 0x16, 0x52, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1E, 0x37, 0x1E, 0x3B, 0x16, 0x1B, 0x16, 0x1D, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x31, 0x1B, 0x34, 0x1A, 0x37, 0x1A, 0x3A, 0x54, 0x6F, 0x61, 0x73, 0x74, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x4E, 0x1C, 0x50, 0x17, 0x48, 0x17, 0x4D, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x2D, 0x1D, 0x31, 0x16, 0x40, 0x16, 0x43, 0x43, 0x61, 0x6E, 0x74, 0x6C, 0x65, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x19, 0x4A, 0x19, 0x50, 0x17, 0x3F, 0x17, 0x41, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x19, 0x1B, 0x1D, 0x1A, 0x38, 0x1A, 0x3B, 0x53, 0x77, 0x65, 0x6C, 0x74, 0x72, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x22, 0x3A, 0x22, 0x3C, 0x15, 0x15, 0x15, 0x1C, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x37, 0x19, 0x39, 0x18, 0x30, 0x18, 0x37, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x48, 0x17, 0x38, 0x17, 0x3C, 0x42, 0x6C, 0x6F, 0x77, 0x68, 0x6F, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3B, 0x18, 0x3F, 0x17, 0x31, 0x17, 0x35, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x4C, 0x17, 0x42, 0x17, 0x44, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x15, 0x1B, 0x19, 0x17, 0x1F, 0x17, 0x23, 0x53, 0x65, 0x61, 0x20, 0x6F, 0x66, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x5E, 0x41, 0x1D, 0x21, 0x1D, 0x22, 0x17, 0x3B, 0x17, 0x4C, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x4D, 0x16, 0x44, 0x16, 0x46, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x31, 0x1B, 0x37, 0x1A, 0x33, 0x1A, 0x36, 0x54, 0x6F, 0x61, 0x73, 0x74, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3A, 0x1D, 0x3F, 0x17, 0x2D, 0x17, 0x31, 0x30, 0x50, 0x61, 0x6C, 0x6D, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x14, 0x1C, 0x16, 0x19, 0x29, 0x19, 0x33, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x17, 0x1A, 0x1B, 0x15, 0x26, 0x15, 0x2B, 0x46, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x15, 0x19, 0x19, 0x17, 0x4F, 0x18, 0x14, 0x54, 0x68, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x40, 0x19, 0x45, 0x15, 0x1D, 0x15, 0x21, 0x53, 0x6E, 0x6F, 0x77, 0x79, 0x20, 0x41, 0x63, 0x72, 0x65, 0x73, 0x5E, 0x54, 0x18, 0x16, 0x18, 0x1B, 0x19, 0x42, 0x19, 0x46, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x45, 0x6E, 0x64, 0x5E, 0x41, 0x1E, 0x1E, 0x1E, 0x23, 0x16, 0x37, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x33, 0x1A, 0x3A, 0x19, 0x24, 0x19, 0x27, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3C, 0x18, 0x3F, 0x17, 0x41, 0x17, 0x48, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x3F, 0x19, 0x41, 0x18, 0x22, 0x18, 0x2D, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x39, 0x19, 0x44, 0x16, 0x52, 0x17, 0x14, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3F, 0x18, 0x4B, 0x19, 0x20, 0x19, 0x22, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3F, 0x1A, 0x4B, 0x19, 0x31, 0x19, 0x33, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2F, 0x17, 0x32, 0x16, 0x2C, 0x16, 0x34, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x19, 0x3C, 0x19, 0x44, 0x16, 0x45, 0x16, 0x48, 0x57, 0x68, 0x69, 0x73, 0x6B, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x4A, 0x19, 0x4F, 0x15, 0x2C, 0x15, 0x31, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x65, 0x64, 0x20, 0x42, 0x61, 0x79, 0x5E, 0x41, 0x19, 0x37, 0x19, 0x3C, 0x15, 0x23, 0x15, 0x28, 0x53, 0x61, 0x6E, 0x64, 0x79, 0x20, 0x50, 0x61, 0x6C, 0x6D, 0x73, 0x5E, 0x41, 0x1D, 0x14, 0x1D, 0x18, 0x18, 0x4C, 0x18, 0x53, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x48, 0x17, 0x51, 0x18, 0x18, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x27, 0x1D, 0x2B, 0x18, 0x43, 0x18, 0x4A, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x42, 0x1A, 0x49, 0x1A, 0x4E, 0x1A, 0x52, 0x53, 0x61, 0x6E, 0x64, 0x79, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x19, 0x14, 0x19, 0x1B, 0x18, 0x42, 0x18, 0x46, 0x57, 0x69, 0x6C, 0x64, 0x66, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x4E, 0x1A, 0x14, 0x19, 0x29, 0x19, 0x2E, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x3F, 0x1E, 0x44, 0x18, 0x44, 0x18, 0x4A, 0x30, 0x4E, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1D, 0x28, 0x1D, 0x2B, 0x17, 0x41, 0x17, 0x4B, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x35, 0x19, 0x3A, 0x16, 0x4D, 0x16, 0x53, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x29, 0x18, 0x2E, 0x18, 0x3F, 0x18, 0x45, 0x44, 0x61, 0x69, 0x73, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x4E, 0x1E, 0x14, 0x19, 0x30, 0x19, 0x35, 0x36, 0x49, 0x73, 0x6C, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x48, 0x61, 0x72, 0x64, 0x6C, 0x79, 0x5E, 0x41, 0x1C, 0x44, 0x1C, 0x4C, 0x17, 0x47, 0x17, 0x4B, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x40, 0x18, 0x44, 0x16, 0x44, 0x16, 0x4C, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3D, 0x18, 0x41, 0x16, 0x4A, 0x16, 0x52, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x40, 0x19, 0x4B, 0x16, 0x4E, 0x16, 0x51, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x37, 0x1B, 0x39, 0x19, 0x2E, 0x19, 0x3F, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1B, 0x2C, 0x1B, 0x31, 0x19, 0x2F, 0x19, 0x36, 0x53, 0x75, 0x6E, 0x73, 0x68, 0x69, 0x6E, 0x65, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x49, 0x1D, 0x3F, 0x1D, 0x44, 0x18, 0x28, 0x18, 0x2F, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x19, 0x33, 0x19, 0x38, 0x16, 0x45, 0x16, 0x4C, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x25, 0x1D, 0x2C, 0x18, 0x4A, 0x18, 0x4F, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x47, 0x1B, 0x4A, 0x18, 0x15, 0x18, 0x21, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x23, 0x1D, 0x29, 0x17, 0x16, 0x17, 0x1C, 0x30, 0x54, 0x61, 0x6C, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1C, 0x46, 0x1C, 0x4E, 0x17, 0x33, 0x17, 0x38, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x41, 0x19, 0x4B, 0x16, 0x3F, 0x16, 0x43, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x21, 0x4F, 0x22, 0x17, 0x15, 0x2C, 0x15, 0x31, 0x43, 0x72, 0x6F, 0x73, 0x73, 0x62, 0x6F, 0x6E, 0x65, 0x73, 0x20, 0x43, 0x61, 0x6D, 0x70, 0x5E, 0x41, 0x1C, 0x2D, 0x1C, 0x32, 0x19, 0x36, 0x19, 0x3E, 0x48, 0x6F, 0x6F, 0x66, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x32, 0x1C, 0x40, 0x17, 0x34, 0x17, 0x37, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x51, 0x1B, 0x1C, 0x1A, 0x33, 0x1A, 0x37, 0x53, 0x77, 0x65, 0x6C, 0x74, 0x72, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x17, 0x1C, 0x20, 0x16, 0x36, 0x16, 0x3B, 0x45, 0x61, 0x72, 0x74, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3C, 0x1A, 0x45, 0x18, 0x33, 0x18, 0x38, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3E, 0x1A, 0x46, 0x18, 0x2D, 0x18, 0x33, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x39, 0x1A, 0x41, 0x17, 0x3C, 0x17, 0x42, 0x50, 0x72, 0x69, 0x63, 0x6B, 0x6C, 0x79, 0x20, 0x53, 0x70, 0x69, 0x74, 0x5E, 0x41, 0x1A, 0x32, 0x1A, 0x36, 0x19, 0x18, 0x19, 0x24, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x39, 0x1C, 0x45, 0x17, 0x23, 0x17, 0x27, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x39, 0x19, 0x45, 0x16, 0x48, 0x16, 0x4C, 0x57, 0x68, 0x69, 0x73, 0x6B, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x46, 0x19, 0x4D, 0x16, 0x47, 0x16, 0x4E, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3B, 0x1D, 0x42, 0x18, 0x36, 0x18, 0x3D, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x18, 0x3A, 0x18, 0x3F, 0x17, 0x36, 0x17, 0x40, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x4A, 0x1A, 0x14, 0x19, 0x2F, 0x19, 0x34, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x47, 0x1A, 0x50, 0x16, 0x3E, 0x16, 0x44, 0x53, 0x6F, 0x61, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x49, 0x1E, 0x2E, 0x1E, 0x33, 0x19, 0x16, 0x19, 0x21, 0x30, 0x52, 0x6F, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x22, 0x34, 0x22, 0x39, 0x14, 0x52, 0x15, 0x1D, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x4E, 0x1E, 0x16, 0x18, 0x30, 0x18, 0x37, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x4F, 0x1E, 0x17, 0x18, 0x22, 0x18, 0x29, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x19, 0x39, 0x1A, 0x15, 0x19, 0x40, 0x19, 0x42, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x23, 0x1D, 0x27, 0x17, 0x3E, 0x17, 0x4C, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x42, 0x18, 0x49, 0x16, 0x43, 0x16, 0x4B, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x37, 0x1A, 0x41, 0x16, 0x25, 0x16, 0x2B, 0x57, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1E, 0x37, 0x1E, 0x41, 0x16, 0x1E, 0x16, 0x24, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3F, 0x1B, 0x14, 0x19, 0x2D, 0x19, 0x30, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x3B, 0x1E, 0x44, 0x18, 0x53, 0x19, 0x1A, 0x30, 0x53, 0x70, 0x69, 0x72, 0x69, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x18, 0x44, 0x18, 0x4B, 0x16, 0x4D, 0x17, 0x16, 0x43, 0x61, 0x72, 0x72, 0x6F, 0x74, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x18, 0x4F, 0x19, 0x1C, 0x18, 0x3B, 0x18, 0x40, 0x57, 0x69, 0x6C, 0x64, 0x66, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x33, 0x1B, 0x39, 0x19, 0x33, 0x19, 0x3E, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x23, 0x1D, 0x2E, 0x19, 0x3C, 0x19, 0x42, 0x35, 0x50, 0x75, 0x75, 0x68, 0x6F, 0x6E, 0x75, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1E, 0x24, 0x1E, 0x2E, 0x16, 0x34, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x32, 0x1A, 0x3C, 0x18, 0x4F, 0x19, 0x16, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x20, 0x3C, 0x20, 0x46, 0x19, 0x22, 0x19, 0x29, 0x41, 0x73, 0x68, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x38, 0x1A, 0x41, 0x18, 0x39, 0x18, 0x41, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1F, 0x3B, 0x1F, 0x44, 0x14, 0x3D, 0x14, 0x45, 0x46, 0x72, 0x69, 0x67, 0x69, 0x64, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x54, 0x1D, 0x3A, 0x1D, 0x46, 0x14, 0x4A, 0x14, 0x50, 0x43, 0x72, 0x79, 0x73, 0x74, 0x61, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1B, 0x25, 0x1B, 0x37, 0x17, 0x39, 0x17, 0x3D, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x47, 0x1D, 0x52, 0x16, 0x1D, 0x16, 0x24, 0x57, 0x69, 0x74, 0x68, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1B, 0x2A, 0x1B, 0x35, 0x18, 0x2B, 0x18, 0x32, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x20, 0x45, 0x71, 0x75, 0x65, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6E, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x5E, 0x54, 0x1C, 0x36, 0x1C, 0x43, 0x1A, 0x4A, 0x1A, 0x50, 0x53, 0x61, 0x6E, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x33, 0x1D, 0x3D, 0x19, 0x38, 0x19, 0x40, 0x30, 0x50, 0x61, 0x74, 0x73, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x39, 0x1D, 0x43, 0x18, 0x19, 0x18, 0x21, 0x30, 0x53, 0x70, 0x69, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x2D, 0x1E, 0x35, 0x18, 0x38, 0x18, 0x42, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1A, 0x3F, 0x1A, 0x48, 0x16, 0x1B, 0x16, 0x24, 0x57, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x35, 0x1A, 0x3E, 0x18, 0x42, 0x18, 0x4B, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x32, 0x1B, 0x39, 0x19, 0x1F, 0x19, 0x2B, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x22, 0x39, 0x22, 0x45, 0x19, 0x1E, 0x19, 0x25, 0x4D, 0x6F, 0x6C, 0x74, 0x65, 0x6E, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x1D, 0x52, 0x1E, 0x27, 0x16, 0x51, 0x17, 0x15, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3B, 0x18, 0x43, 0x16, 0x53, 0x17, 0x1E, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1A, 0x1F, 0x1A, 0x27, 0x1B, 0x23, 0x1B, 0x2E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1E, 0x2E, 0x1E, 0x36, 0x18, 0x43, 0x18, 0x4E, 0x33, 0x48, 0x61, 0x6C, 0x66, 0x20, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x32, 0x1E, 0x3C, 0x17, 0x32, 0x17, 0x3B, 0x30, 0x43, 0x72, 0x61, 0x7A, 0x79, 0x20, 0x45, 0x64, 0x64, 0x69, 0x65, 0x27, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x50, 0x1E, 0x19, 0x17, 0x26, 0x17, 0x30, 0x30, 0x41, 0x74, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1B, 0x18, 0x1B, 0x27, 0x14, 0x32, 0x14, 0x38, 0x43, 0x68, 0x69, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x3E, 0x1D, 0x48, 0x19, 0x34, 0x19, 0x3D, 0x30, 0x50, 0x61, 0x74, 0x73, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x3F, 0x1A, 0x16, 0x19, 0x3B, 0x19, 0x3F, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x34, 0x1C, 0x47, 0x17, 0x2E, 0x17, 0x33, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x16, 0x1C, 0x26, 0x17, 0x2A, 0x17, 0x30, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x19, 0x38, 0x19, 0x44, 0x1A, 0x36, 0x1A, 0x3E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x54, 0x22, 0x3D, 0x22, 0x4B, 0x14, 0x48, 0x14, 0x4F, 0x53, 0x6B, 0x75, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x41, 0x1D, 0x4C, 0x17, 0x35, 0x17, 0x3E, 0x30, 0x4D, 0x61, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x42, 0x1A, 0x16, 0x19, 0x35, 0x19, 0x3A, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x3B, 0x19, 0x45, 0x15, 0x2A, 0x15, 0x34, 0x49, 0x6E, 0x6B, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x22, 0x2B, 0x22, 0x33, 0x14, 0x50, 0x15, 0x1D, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x1E, 0x1B, 0x25, 0x17, 0x40, 0x17, 0x4F, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x53, 0x1E, 0x48, 0x16, 0x3C, 0x16, 0x3E, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x34, 0x19, 0x40, 0x16, 0x3B, 0x16, 0x44, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x50, 0x1C, 0x14, 0x19, 0x1E, 0x19, 0x3A, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2D, 0x17, 0x3B, 0x16, 0x35, 0x16, 0x3D, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1C, 0x34, 0x1C, 0x4B, 0x17, 0x28, 0x17, 0x2D, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x1B, 0x1D, 0x20, 0x17, 0x37, 0x17, 0x4E, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x47, 0x1A, 0x14, 0x17, 0x46, 0x17, 0x4F, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1E, 0x34, 0x1E, 0x45, 0x16, 0x25, 0x16, 0x2C, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x31, 0x1C, 0x3B, 0x17, 0x38, 0x17, 0x44, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1C, 0x28, 0x1C, 0x37, 0x19, 0x3F, 0x19, 0x47, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x73, 0x68, 0x6F, 0x65, 0x20, 0x56, 0x69, 0x6C, 0x6C, 0x61, 0x67, 0x65, 0x5E, 0x41, 0x19, 0x46, 0x19, 0x52, 0x15, 0x2A, 0x15, 0x34, 0x54, 0x68, 0x65, 0x20, 0x53, 0x68, 0x6F, 0x72, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x65, 0x64, 0x20, 0x42, 0x61, 0x79, 0x5E, 0x41, 0x1D, 0x18, 0x1D, 0x2A, 0x18, 0x4F, 0x19, 0x16, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x3B, 0x19, 0x43, 0x17, 0x37, 0x17, 0x47, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x18, 0x1D, 0x24, 0x18, 0x41, 0x18, 0x4C, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x39, 0x19, 0x3F, 0x18, 0x22, 0x18, 0x38, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x40, 0x1B, 0x46, 0x17, 0x4C, 0x18, 0x23, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x50, 0x18, 0x3E, 0x18, 0x48, 0x33, 0x54, 0x72, 0x61, 0x6E, 0x71, 0x75, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x51, 0x1E, 0x1A, 0x18, 0x3F, 0x18, 0x4F, 0x30, 0x53, 0x65, 0x72, 0x65, 0x6E, 0x69, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x4B, 0x17, 0x1E, 0x17, 0x2E, 0x30, 0x41, 0x72, 0x64, 0x65, 0x6E, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x14, 0x1C, 0x29, 0x17, 0x22, 0x17, 0x29, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x4C, 0x1B, 0x50, 0x19, 0x18, 0x19, 0x3D, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3F, 0x1D, 0x4D, 0x19, 0x22, 0x19, 0x2D, 0x30, 0x44, 0x72, 0x69, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x2D, 0x18, 0x39, 0x18, 0x44, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x51, 0x1C, 0x21, 0x17, 0x31, 0x17, 0x3B, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x15, 0x1E, 0x25, 0x1A, 0x28, 0x1A, 0x32, 0x30, 0x41, 0x65, 0x73, 0x6F, 0x70, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x18, 0x53, 0x19, 0x1A, 0x17, 0x37, 0x17, 0x4E, 0x54, 0x68, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x45, 0x1E, 0x50, 0x18, 0x1C, 0x18, 0x2B, 0x30, 0x48, 0x6F, 0x74, 0x7A, 0x65, 0x70, 0x6C, 0x6F, 0x74, 0x7A, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x4F, 0x1C, 0x2B, 0x16, 0x51, 0x17, 0x17, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x47, 0x1E, 0x32, 0x16, 0x4C, 0x16, 0x50, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x34, 0x1B, 0x17, 0x19, 0x27, 0x19, 0x2C, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x50, 0x1E, 0x1B, 0x15, 0x4E, 0x16, 0x1E, 0x42, 0x72, 0x69, 0x64, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x2D, 0x18, 0x45, 0x18, 0x52, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x3D, 0x19, 0x44, 0x17, 0x48, 0x18, 0x22, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x39, 0x1A, 0x46, 0x19, 0x16, 0x19, 0x24, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x1C, 0x3D, 0x1C, 0x4D, 0x17, 0x39, 0x17, 0x45, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x1B, 0x20, 0x1B, 0x2F, 0x1A, 0x31, 0x1A, 0x3E, 0x48, 0x6F, 0x74, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1C, 0x15, 0x1C, 0x20, 0x15, 0x52, 0x16, 0x24, 0x30, 0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x2A, 0x1D, 0x3B, 0x17, 0x19, 0x17, 0x25, 0x30, 0x53, 0x68, 0x69, 0x6D, 0x6D, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x41, 0x1D, 0x4E, 0x18, 0x4C, 0x19, 0x1C, 0x30, 0x4C, 0x69, 0x6C, 0x61, 0x63, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x32, 0x1E, 0x3D, 0x18, 0x20, 0x18, 0x34, 0x30, 0x4C, 0x6F, 0x63, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x30, 0x19, 0x46, 0x1A, 0x2B, 0x1A, 0x35, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1A, 0x41, 0x1B, 0x15, 0x17, 0x2C, 0x17, 0x37, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x35, 0x1E, 0x46, 0x17, 0x1E, 0x17, 0x2B, 0x30, 0x50, 0x61, 0x72, 0x61, 0x64, 0x69, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x37, 0x1A, 0x47, 0x17, 0x38, 0x17, 0x46, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x15, 0x1A, 0x1E, 0x1B, 0x14, 0x1B, 0x2D, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1E, 0x46, 0x1F, 0x15, 0x18, 0x31, 0x18, 0x41, 0x30, 0x54, 0x68, 0x65, 0x6F, 0x62, 0x72, 0x6F, 0x6D, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x4E, 0x1F, 0x26, 0x14, 0x2A, 0x14, 0x34, 0x31, 0x49, 0x63, 0x69, 0x63, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x51, 0x1D, 0x1A, 0x17, 0x32, 0x17, 0x4D, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x35, 0x18, 0x3F, 0x18, 0x44, 0x19, 0x1D, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x2A, 0x1B, 0x3F, 0x18, 0x16, 0x18, 0x22, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x48, 0x1E, 0x17, 0x17, 0x48, 0x18, 0x19, 0x30, 0x51, 0x75, 0x69, 0x65, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x51, 0x1F, 0x1A, 0x17, 0x49, 0x18, 0x28, 0x30, 0x48, 0x6F, 0x74, 0x7A, 0x65, 0x70, 0x6C, 0x6F, 0x74, 0x7A, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1B, 0x52, 0x1C, 0x27, 0x16, 0x3D, 0x16, 0x4B, 0x45, 0x61, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x48, 0x1B, 0x1A, 0x19, 0x15, 0x19, 0x26, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x2D, 0x1E, 0x47, 0x17, 0x4B, 0x18, 0x17, 0x30, 0x42, 0x6F, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x32, 0x14, 0x49, 0x15, 0x1B, 0x31, 0x53, 0x6E, 0x6F, 0x77, 0x62, 0x61, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x36, 0x1C, 0x45, 0x14, 0x2C, 0x14, 0x43, 0x31, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6D, 0x61, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1E, 0x2F, 0x1E, 0x48, 0x16, 0x2D, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x40, 0x18, 0x4D, 0x18, 0x43, 0x19, 0x1F, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1B, 0x1B, 0x1B, 0x32, 0x16, 0x48, 0x17, 0x18, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1E, 0x1E, 0x2A, 0x17, 0x4F, 0x18, 0x2E, 0x30, 0x43, 0x72, 0x65, 0x73, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x15, 0x1E, 0x2E, 0x19, 0x16, 0x19, 0x25, 0x30, 0x52, 0x6F, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x4F, 0x16, 0x39, 0x17, 0x18, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x4A, 0x1C, 0x37, 0x17, 0x18, 0x17, 0x21, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x14, 0x4E, 0x15, 0x29, 0x16, 0x30, 0x16, 0x40, 0x35, 0x52, 0x61, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x18, 0x32, 0x19, 0x14, 0x18, 0x4A, 0x19, 0x17, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x42, 0x1F, 0x1B, 0x17, 0x2D, 0x17, 0x3F, 0x30, 0x45, 0x6C, 0x64, 0x6F, 0x72, 0x61, 0x64, 0x6F, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x20, 0x22, 0x37, 0x16, 0x43, 0x17, 0x17, 0x37, 0x54, 0x65, 0x70, 0x68, 0x72, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x50, 0x1A, 0x39, 0x14, 0x25, 0x14, 0x31, 0x31, 0x47, 0x6C, 0x61, 0x63, 0x69, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x4C, 0x23, 0x25, 0x17, 0x52, 0x18, 0x27, 0x37, 0x53, 0x63, 0x6F, 0x72, 0x69, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x38, 0x1C, 0x4D, 0x14, 0x4D, 0x15, 0x26, 0x31, 0x42, 0x65, 0x72, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x47, 0x1B, 0x26, 0x17, 0x19, 0x17, 0x2B, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x4C, 0x1A, 0x21, 0x18, 0x3A, 0x19, 0x15, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x26, 0x1B, 0x3F, 0x17, 0x3E, 0x18, 0x15, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x23, 0x18, 0x23, 0x32, 0x14, 0x32, 0x14, 0x49, 0x33, 0x48, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x20, 0x1E, 0x3E, 0x14, 0x2D, 0x14, 0x43, 0x31, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x26, 0x1F, 0x3D, 0x18, 0x1A, 0x18, 0x39, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x2E, 0x1D, 0x4C, 0x1A, 0x2C, 0x1A, 0x44, 0x32, 0x44, 0x75, 0x73, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1B, 0x1E, 0x30, 0x1A, 0x3E, 0x1B, 0x22, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x39, 0x1B, 0x4C, 0x19, 0x15, 0x19, 0x40, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x1C, 0x1E, 0x37, 0x17, 0x2A, 0x17, 0x4A, 0x30, 0x42, 0x6F, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x2C, 0x19, 0x15, 0x19, 0x47, 0x1A, 0x1D, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x4C, 0x1F, 0x1B, 0x16, 0x24, 0x17, 0x21, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x2A, 0x15, 0x45, 0x16, 0x29, 0x16, 0x4B, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x44, 0x23, 0x32, 0x14, 0x1C, 0x14, 0x31, 0x33, 0x48, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1D, 0x36, 0x1E, 0x4A, 0x16, 0x3F, 0x16, 0x4B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x50, 0x1E, 0x25, 0x16, 0x2C, 0x17, 0x1D, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x16, 0x19, 0x34, 0x19, 0x37, 0x1A, 0x1A, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x21, 0x1C, 0x43, 0x19, 0x2B, 0x19, 0x4D, 0x30, 0x48, 0x6F, 0x6F, 0x66, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x17, 0x4F, 0x18, 0x2B, 0x19, 0x31, 0x1A, 0x1D, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x2A, 0x20, 0x22, 0x18, 0x3A, 0x18, 0x50, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x38, 0x1A, 0x14, 0x1A, 0x42, 0x1B, 0x2E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x1D, 0x1D, 0x41, 0x16, 0x2F, 0x16, 0x52, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x1F, 0x14, 0x48, 0x14, 0x22, 0x14, 0x42, 0x30, 0x50, 0x72, 0x69, 0x73, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x34, 0x1E, 0x30, 0x1A, 0x46, 0x1B, 0x1C, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x3E, 0x23, 0x25, 0x17, 0x1C, 0x17, 0x3E, 0x37, 0x4D, 0x61, 0x67, 0x6D, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x14, 0x21, 0x3F, 0x14, 0x26, 0x14, 0x45, 0x33, 0x54, 0x72, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x38, 0x1E, 0x21, 0x15, 0x46, 0x16, 0x2B, 0x30, 0x52, 0x69, 0x64, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x40, 0x15, 0x41, 0x16, 0x4C, 0x17, 0x25, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x4D, 0x19, 0x37, 0x1A, 0x36, 0x1B, 0x1E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x20, 0x1E, 0x20, 0x1B, 0x1D, 0x1B, 0x3A, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x14, 0x1F, 0x42, 0x19, 0x51, 0x1A, 0x3E, 0x37, 0x50, 0x75, 0x6D, 0x69, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x39, 0x1D, 0x19, 0x15, 0x37, 0x16, 0x3D, 0x30, 0x48, 0x6F, 0x72, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x2C, 0x1A, 0x23, 0x15, 0x16, 0x15, 0x3F, 0x30, 0x41, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x42, 0x1D, 0x37, 0x18, 0x32, 0x19, 0x20, 0x30, 0x54, 0x75, 0x72, 0x74, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x22, 0x1A, 0x15, 0x16, 0x2A, 0x17, 0x1C, 0x30, 0x43, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x35, 0x1A, 0x25, 0x19, 0x16, 0x19, 0x4F, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x37, 0x21, 0x18, 0x17, 0x1B, 0x17, 0x39, 0x30, 0x57, 0x68, 0x6F, 0x72, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x3E, 0x20, 0x3C, 0x17, 0x49, 0x18, 0x3A, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x2F, 0x15, 0x2E, 0x17, 0x26, 0x18, 0x18, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x16, 0x53, 0x17, 0x4E, 0x19, 0x27, 0x1A, 0x1D, 0x30, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x73, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x4E, 0x16, 0x34, 0x14, 0x27, 0x15, 0x3C, 0x35, 0x57, 0x65, 0x62, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x3A, 0x23, 0x29, 0x1A, 0x16, 0x1B, 0x1C, 0x37, 0x42, 0x61, 0x73, 0x61, 0x6C, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x26, 0x1E, 0x4B, 0x15, 0x42, 0x17, 0x1B, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x4D, 0x1E, 0x1E, 0x14, 0x34, 0x15, 0x1D, 0x31, 0x49, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x1D, 0x15, 0x4D, 0x14, 0x36, 0x15, 0x3F, 0x35, 0x57, 0x65, 0x62, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x52, 0x1B, 0x4A, 0x15, 0x21, 0x16, 0x22, 0x30, 0x52, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x23, 0x19, 0x24, 0x18, 0x35, 0x19, 0x35, 0x34, 0x46, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x35, 0x19, 0x20, 0x16, 0x3D, 0x18, 0x22, 0x30, 0x48, 0x61, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x17, 0x1B, 0x19, 0x15, 0x49, 0x16, 0x4C, 0x30, 0x42, 0x69, 0x72, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x21, 0x1F, 0x4B, 0x14, 0x2C, 0x15, 0x17, 0x31, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x1B, 0x22, 0x2C, 0x17, 0x2D, 0x18, 0x33, 0x37, 0x49, 0x67, 0x6E, 0x65, 0x6F, 0x75, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x49, 0x19, 0x2F, 0x19, 0x22, 0x1B, 0x3E, 0x32, 0x59, 0x65, 0x6C, 0x6C, 0x6F, 0x77, 0x20, 0x42, 0x72, 0x69, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x2C, 0x1A, 0x2C, 0x17, 0x26, 0x18, 0x48, 0x30, 0x44, 0x6F, 0x6C, 0x70, 0x68, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x3E, 0x1C, 0x37, 0x14, 0x22, 0x15, 0x19, 0x31, 0x53, 0x6E, 0x6F, 0x77, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x2C, 0x23, 0x17, 0x14, 0x36, 0x15, 0x4E, 0x33, 0x50, 0x69, 0x72, 0x61, 0x74, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x31, 0x21, 0x20, 0x15, 0x31, 0x17, 0x1A, 0x30, 0x57, 0x68, 0x6F, 0x72, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x3C, 0x17, 0x3A, 0x18, 0x1E, 0x19, 0x3C, 0x35, 0x4A, 0x75, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x20, 0x16, 0x23, 0x1F, 0x18, 0x32, 0x19, 0x3F, 0x37, 0x4C, 0x61, 0x76, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x4E, 0x1D, 0x29, 0x1A, 0x2A, 0x1B, 0x41, 0x32, 0x44, 0x65, 0x73, 0x65, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x2F, 0x15, 0x3B, 0x15, 0x22, 0x19, 0x2B, 0x35, 0x44, 0x6F, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x3E, 0x22, 0x36, 0x19, 0x3F, 0x1B, 0x37, 0x37, 0x4C, 0x61, 0x76, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x1B, 0x17, 0x4B, 0x19, 0x41, 0x1B, 0x2D, 0x36, 0x54, 0x68, 0x65, 0x20, 0x43, 0x6C, 0x6F, 0x75, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1A, 0x29, 0x1D, 0x34, 0x16, 0x2E, 0x19, 0x46, 0x30, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x3C, 0x19, 0x1B, 0x14, 0x4A, 0x18, 0x1D, 0x35, 0x4A, 0x75, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x00 }; ParseHi1ResponsePackets(TIlesets); Hi1Client.Send(TIlesets); } else if(command == ".D") { MoveTowards(int.Parse(commandArgs[1]), int.Parse(commandArgs[2])); } else if(command == ".RD") { RebuildMapPngFromDb(); } else if(command == ".AWARD") { MemoryStream ms = new MemoryStream(); ms.WriteByte(0x18); ms.WriteByte(0x33); byte[] SecCodePacket = GenerateSecCode(); ms.Write(SecCodePacket, 0x00, SecCodePacket.Length); byte[] awardIdBytes = Encoding.UTF8.GetBytes(commandArgs[1].ToString()); ms.Write(awardIdBytes, 0x00, awardIdBytes.Length); ms.WriteByte(0x0a); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); HI1Server.Send(packet); } else if(command == ".SWF") { MemoryStream ms = new MemoryStream(); ms.WriteByte(PACKET_SWF); byte[] swfName = Encoding.UTF8.GetBytes(commandArgs[1]); ms.Write(swfName, 0x00, swfName.Length); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] packet = ms.ToArray(); ParseClientRequestPacket(packet); Hi1Client.Send(packet); } else if(command == ".ST") { WaitQuest = false; WaitMove = false; WalkToX = X; WalkToY = Y; } else if(command == ".TR") { MemoryStream ms = new MemoryStream(); ms.WriteByte(0x29); byte[] strB = Encoding.UTF8.GetBytes(commandArgs[1]); ms.Write(strB, 0, strB.Length); ms.WriteByte(0x00); ms.Seek(0x00, SeekOrigin.Begin); byte[] Trransprt = ms.ToArray(); ParseClientRequestPacket(Trransprt); HI1Server.Send(Trransprt); } return false; } else { return true; } } public static byte[] GenerateSecCode() { var i = 0; SecCodeCount++; SecCodeSeeds[SecCodeCount % 3] = (byte)(SecCodeSeeds[SecCodeCount % 3] + SecCodeInc); SecCodeSeeds[SecCodeCount % 3] = (byte)(SecCodeSeeds[SecCodeCount % 3] % 92); i = SecCodeSeeds[0] + SecCodeSeeds[1] * SecCodeSeeds[2] - SecCodeSeeds[1]; i = Math.Abs(i); i = i % 92; byte[] SecCode = new byte[4]; SecCode[0] = (byte)(SecCodeSeeds[0] + 33); SecCode[1] = (byte)(SecCodeSeeds[1] + 33); SecCode[2] = (byte)(SecCodeSeeds[2] + 33); SecCode[3] = (byte)(i + 33); return SecCode; } private static void DecodeUserInfoResponsePacket(byte[] Packet) { SecCodeSeeds[0] = (byte)(Packet[1] - 33); SecCodeSeeds[1] = (byte)(Packet[2] - 33); SecCodeSeeds[2] = (byte)(Packet[3] - 33); SecCodeInc = Packet[4] - 33; if(Packet[5] == 'A') { IsAdmin = true; IsMod = true; } else if(Packet[5] == 'M') { IsMod = true; } else { Console.WriteLine("Unkown user type: " + (char)Packet[5]); } Console.WriteLine("Sec Code Seed: " + BitConverter.ToString(SecCodeSeeds)); Console.WriteLine("Sec Code Incrementer: " + SecCodeInc); } public class Item{ public Item() { } public int icon_id; public string name; public string plural; public string description; } private static void DecodeTileinfoPacket(byte[] Packet) { string TileInfo = Encoding.UTF8.GetString(Packet).Substring(1, Packet.Length - 2); Console.WriteLine("TOP RIGHT: "+TileInfo); } private static bool ParseServerResponsePacket(byte[] Packet) { bool passiton = true; byte id = Packet[0]; Console.WriteLine("< " + BitConverter.ToString(Packet).Replace("-", " ")); switch (id) { case PACKET_LOGIN: DecodeLoginResponsePacket(Packet); break; case PACKET_CHAT: DecodeChatResponsePacket(Packet); break; case PACKET_USERINFO: DecodeUserInfoResponsePacket(Packet); break; case PACKET_MOVEMENT: DecodeMovementResponsePacket(Packet); break; case PACKET_TILESET_AREA: DecodeTileAreasResponsePacket(Packet); break; case PACKET_SWF_2: case PACKET_SWF_3: case PACKET_SWF: DecodeSwfLoadPacket(Packet); break; case PACKET_DISCONNECT: Console.WriteLine("Disconnect Packet (DISCARDED!)"); passiton = false; break; default: break; } return passiton; } public static bool ParseClientRequestPacket(byte[] Packet) { bool SEND = true; byte id = Packet[0]; Console.WriteLine("> " + BitConverter.ToString(Packet).Replace("-", " ")); switch (id) { case PACKET_LOGIN: DecodeLoginRequestPacket(Packet); break; case PACKET_CHAT: SEND = DecodeChatSendPacket(Packet); break; case PACKET_MOVE: DecodeMovementPacket(Packet); break; default: break; } return SEND; } } }