From c25ec098a7e3efa01a9ddb269ae53c81a3bd99f6 Mon Sep 17 00:00:00 2001 From: Bouletmarc Date: Mon, 18 Apr 2022 04:06:03 -0400 Subject: [PATCH] V1.2 Added RWD xray to .bin --- Class_ECUS.cs | 4 +- Class_RWD.cs | 560 +++++++++++++++++++ FlashToolTest.csproj | 1 + GForm_Main.cs | 1020 +++++++++++++++++++---------------- GForm_Main.resx | 3 + GForm_PlatformSelect.cs | 101 ++-- GForm_PlatformSelect.resx | 3 + bin/Debug/FlashToolTest.exe | Bin 258560 -> 267264 bytes bin/Debug/FlashToolTest.pdb | Bin 99840 -> 124416 bytes 9 files changed, 1186 insertions(+), 506 deletions(-) create mode 100644 Class_RWD.cs diff --git a/Class_ECUS.cs b/Class_ECUS.cs index b577f8d..242ca7e 100644 --- a/Class_ECUS.cs +++ b/Class_ECUS.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; internal class Class_ECUS { - internal Class_ECUS(string string_4, string string_5, byte byte_1, string string_6, int int_4, int int_6) + internal Class_ECUS(string string_4, string string_5, byte byte_1, string string_6, int int_4, int int_6, string TrannyType) { this.RomSize_String = string_4; this.ECU_Byte = byte_1; @@ -12,6 +12,7 @@ internal class Class_ECUS this.ReadingSize = int_4 - 1; this.FirmwareSize = int_6; this.RomSize = int_4; + this.TransmissionType = TrannyType; } public string RomSize_String { get; set; } @@ -21,5 +22,6 @@ internal class Class_ECUS public int ReadingSize { get; set; } public int FirmwareSize { get; set; } public int RomSize { get; set; } + public string TransmissionType { get; set; } } diff --git a/Class_RWD.cs b/Class_RWD.cs new file mode 100644 index 0000000..5e8dec1 --- /dev/null +++ b/Class_RWD.cs @@ -0,0 +1,560 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +static class Class_RWD +{ + private static string part_number_prefix = ""; + private static List firmware_candidates = new List(); + public static byte[] _keys = new byte[] { }; + private static byte[] _firmware_encrypted = new byte[] { }; + public static UInt32 start = 0U; + public static UInt32 size = 0U; + + private static GForm_Main GForm_Main_0; + + public static void Load(ref GForm_Main GForm_Main_1) + { + GForm_Main_0 = GForm_Main_1; + } + + public static byte[] Decompress(string ThisFile) + { + Stream compressedStream = new MemoryStream(File.ReadAllBytes(ThisFile)); + var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress); + MemoryStream resultStream = new MemoryStream(); + zipStream.CopyTo(resultStream); + return resultStream.ToArray(); + } + + + public static void LoadRWD(string f_name, bool FullDecrypt) + { + byte[] data = new byte[] { }; + if (Path.GetExtension(f_name).ToLower().Contains("gz")) data = Decompress(f_name); + else data = File.ReadAllBytes(f_name); + + GForm_Main_0.method_1("Decrypting file: " + f_name); + + string indicatorBytes = data[0].ToString("x2") + data[1].ToString("x2") + data[2].ToString("x2"); + if (indicatorBytes != "5a0d0a") + { + GForm_Main_0.method_1("Not Compatible file!"); + return; + } + + byte[] headers0 = { }; + byte[] headers1 = { }; + byte[] headers2 = { }; + byte[] headers3 = { }; + byte[] headers4 = { }; + byte[] headers5 = { }; + int idx = 0; + idx += 3; + for (int i = 0; i < 6; i++) + { + // first byte is number of values + var count = data[idx]; + idx += 1; + + byte[] header = { }; + for (int j = 0; j < count; j++) + { + // first byte is length of value + int length = data[idx]; + idx += 1; + + byte[] v = Slice(data, idx, idx + length); + idx += length; + + header = Push(header, v); + } + + if (i == 0) headers0 = header; + if (i == 1) headers1 = header; + if (i == 2) headers2 = header; //ECU Type (Auto/Manual) + if (i == 3) headers3 = header; //Versions + if (i == 4) headers4 = header; //Security Keys + if (i == 5) headers5 = header; //Firmware Keys + } + + start = ReadUInt32BE(data, idx); + idx += 4; + + size = ReadUInt32BE(data, idx); + idx += 4; + + byte[] firmware = Slice(data, idx, data.Length - 4); + idx += firmware.Length; + + UInt32 checksum = ReadUInt32BE(data, idx); + idx += 4; + + if (idx != data.Length) GForm_Main_0.method_1("not at end of file after unpacking"); + if ((headers3.Length / 16) != (headers4.Length / 6)) GForm_Main_0.method_1("different number of versions and security access tokens"); + + _firmware_encrypted = firmware; + _keys = headers5; + + if (FullDecrypt) DecryptRWD(f_name); + } + + private static void DecryptRWD(string f_name) + { + part_number_prefix = get_part_number_prefix(f_name); + firmware_candidates = decrypt(part_number_prefix); + + if (firmware_candidates.Count == 0) + { + //try with a shorter part number + GForm_Main_0.method_1("failed on long part number, trying truncated part number ..."); + part_number_prefix = get_part_number_prefix(f_name, true); + firmware_candidates = decrypt(part_number_prefix); + } + + if (firmware_candidates.Count == 0) + { + GForm_Main_0.method_1("decryption failed!"); + GForm_Main_0.method_1("(could not find a cipher that results in the part number being in the data)"); + return; + } + + if (firmware_candidates.Count > 1) GForm_Main_0.method_1("multiple sets of keys resulted in data containing the part number"); + + //################################################################### + //################################################################### + /*List firmware_good = new List(); + idx = 0; + + foreach (byte[] fc in firmware_candidates) + { + //# concat all address blocks to allow checksum validation using memory addresses + byte[] firmwareBLK = new byte[] { }; + foreach (int block in xrange(fc.Length)) { + start = firmware_blocks[block]["start"]; + //# fill gaps with \x00; + if (firmwareBLK.Length < start) { + firmwareBLK += '\x00' * (start - firmwareBLK.Length); + } + firmwareBLK += fc[block]; + } + + //# validate known checksums + if (f_base in checksums.keys()) + { + GForm_Main_0.method_1(string.Format("firmware[{0}] checksums:", idx)); + bool match = true; + foreach (start, end in checksums[f_base]) + { + byte sum = ord(get_checksum(firmwareBLK[start: end])); + byte chk = ord(firmwareBLK[end]); + string Value2 = ""; + if (chk == sum) Value2 = "="; + else Value2 = "!="; + GForm_Main_0.method_1(string.Format("{0} {1} {2}", chk.ToString("X2"), Value2, sum.ToString("X2"))); + if (sum != chk) match = false; + } + if (match) + { + GForm_Main_0.method_1("checksums good!"); + firmware_good.append(firmwareBLK); + } + else + { + GForm_Main_0.method_1("checksums bad!"); + } + } + else + { + //# no checksums so assume good + firmware_good.append(firmwareBLK); + } + + idx += 1; + }*/ + //################################################################### + //################################################################### + + //Saving Decrypted Firmwares + foreach (byte[] f_data in firmware_candidates) + //foreach (byte[] f_data in firmware_good) + { + uint start_addr = start; + string ThisPath = Path.GetDirectoryName(f_name) + @"\" + Path.GetFileNameWithoutExtension(f_name).Replace(".rwd", "").Replace(".RWD", "") + ".0x" + start_addr.ToString("X") + ".bin"; + File.Create(ThisPath).Dispose(); + File.WriteAllBytes(ThisPath, f_data); //-> f_data[start_addr:] + } + } + + public static byte[] Push(byte[] bArray, byte[] newBytes) + { + byte[] newArray = new byte[bArray.Length + newBytes.Length]; + bArray.CopyTo(newArray, newBytes.Length); + for (int i = 0; i < newBytes.Length; i++) + { + newArray[i] = newBytes[i]; + } + return newArray; + } + + public static byte[] Slice(byte[] bArray, int StartInd, int EndInd) + { + int Lenght = (EndInd - StartInd); + byte[] newArray = new byte[Lenght]; + for (int i = 0; i < Lenght; i++) + { + newArray[i] = bArray[StartInd + i]; + } + return newArray; + } + + public static UInt32 ReadUInt32BE(byte[] buffer, int StartInd) + { + var value = BitConverter.ToUInt32(buffer, StartInd); + var rs = BitConverter.ToUInt32(BitConverter.GetBytes(value).Reverse().ToArray(), 0); + return rs; + } + + private static string get_part_number_prefix(string fn, bool Short = false) + { + string f_name = Path.GetFileNameWithoutExtension(fn); + f_name = f_name.Replace("-", "").Replace("_", ""); + + string prefix = f_name.Substring(0, 5) + "-" + f_name.Substring(5, 3); + if (!Short) prefix += '-' + f_name.Substring(8, 4); + + return prefix; + } + + public static byte[] StringToByteArray(string hex) + { + return Enumerable.Range(0, hex.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) + .ToArray(); + } + + static byte[] _get_decoder(string key1, string key2, string key3, string op1, string op2, string op3) { + byte[] decoder = new byte[256]; + List values = new List { }; + + for (int e = 0; e < 256; e++) { + byte KB1 = StringToByteArray(key1)[0]; + byte KB2 = StringToByteArray(key2)[0]; + byte KB3 = StringToByteArray(key3)[0]; + uint d = GetCalc(op3, GetCalc(op2, GetCalc(op1, (uint)e, KB1), KB2), KB3) & 0xFF; + decoder[e] = (byte)d; + values.Add((byte) d); + } + if (values.Count == 256) return decoder; + return null; + } + + private static uint GetCalc(string ThisOperator, uint V1, uint V2) + { + if (ThisOperator == "^") return CalcXOR(V1, V2); + if (ThisOperator == "&") return CalcAND(V1, V2); + if (ThisOperator == "|") return CalcOR(V1, V2); + if (ThisOperator == "+") return CalcADD(V1, V2); + if (ThisOperator == "-") return CalcSUB(V1, V2); + if (ThisOperator == "*") return CalcMUL(V1, V2); + if (ThisOperator == "/") return CalcDIV(V1, V2); + if (ThisOperator == "%") return CalcMOD(V1, V2); + return 0; + } + + private static uint CalcXOR(uint V1, uint V2) + { + return V1 ^ V2; + } + + private static uint CalcAND(uint V1, uint V2) + { + return V1 & V2; + } + + private static uint CalcOR(uint V1, uint V2) + { + return V1 | V2; + } + + private static uint CalcADD(uint V1, uint V2) + { + return V1 + V2; + } + + private static uint CalcSUB(uint V1, uint V2) + { + return V1 - V2; + } + + private static uint CalcMUL(uint V1, uint V2) + { + return V1 * V2; + } + + private static uint CalcDIV(uint V1, uint V2) + { + return V1 / V2; + } + + private static uint CalcMOD(uint V1, uint V2) + { + return V1 % V2; + } + + private static string[] swapTwoNumber(string[] list, int k, int i) + { + string[] BufferedContent = new string[list.Length]; + for (int i2 = 0; i2 < list.Length; i2++) BufferedContent[i2] = list[i2]; + + string temp = BufferedContent[k]; + BufferedContent[k] = BufferedContent[i]; + BufferedContent[i] = temp; + return BufferedContent; + } + + private static string[] CheckIntegrity(string[] Bufferedlist, string[] BufferedDone) + { + string OutputLine = ""; + for (int i = 0; i < Bufferedlist.Length; i++) OutputLine += Bufferedlist[i] + "|"; + + bool Founded = false; + for (int i = 0; i < BufferedDone.Length; i++) + { + if (BufferedDone[i] == OutputLine) Founded = true; + } + if (!Founded) + { + string[] NewBuffer = new string[BufferedDone.Length + 1]; + for (int i = 0; i < BufferedDone.Length; i++) NewBuffer[i] = BufferedDone[i]; + NewBuffer[BufferedDone.Length] = OutputLine; + BufferedDone = NewBuffer; + } + return BufferedDone; + } + + public static string[] prnPermut(string[] list) + { + string[] DoThisList = list; + string[] BufferedContent = new string[] { }; + + string[] Bufferedlist = { DoThisList[0], DoThisList[1], DoThisList[2] }; //A-B-C + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + + for (int i = 0; i < DoThisList.Length; i++) + { + //A-B-C + //B-A-C + //A-C-B + //C-B-A + Bufferedlist = swapTwoNumber(DoThisList, 0, i); //SWAP A & XX + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + Bufferedlist = swapTwoNumber(DoThisList, 1, i); //SWAP B & XX + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + } + //A-B-c -> B-C-A + Bufferedlist = swapTwoNumber(DoThisList, 0, 2); //SWAP A & C + Bufferedlist = swapTwoNumber(Bufferedlist, 0, 1); //SWAP A & B + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + //A-B-c -> C-A-B + Bufferedlist = swapTwoNumber(DoThisList, 0, 1); //SWAP A & B + Bufferedlist = swapTwoNumber(Bufferedlist, 0, 2); //SWAP A & C + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + + return BufferedContent; + } + + public static string[] prnPermutALL(string[] list) + { + string[] DoThisList = list; + string[] BufferedContent = new string[] { }; + int StartInd = 0; + + string[] Bufferedlist = new string[]{}; + //BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + + for (int i4 = StartInd; i4 < DoThisList.Length; i4++) + { + for (int i3 = StartInd; i3 < DoThisList.Length; i3++) + { + for (int i2 = StartInd; i2 < DoThisList.Length; i2++) + { + string[] OperatorsList = new string[3] { DoThisList[i2], DoThisList[i3], DoThisList[i4] }; + BufferedContent = CheckIntegrity(OperatorsList, BufferedContent); + + for (int i = StartInd; i < 3; i++) + { + Bufferedlist = swapTwoNumber(OperatorsList, StartInd, i); //SWAP A & XX + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + Bufferedlist = swapTwoNumber(OperatorsList, StartInd + 1, i); //SWAP B & XX + BufferedContent = CheckIntegrity(Bufferedlist, BufferedContent); + } + } + } + } + + return BufferedContent; + } + + + private static List decrypt(string search_value) + { + //# sometimes there is an extra character after each character + //# 37805-RBB-J530 -> 3377880550--RRBCBA--JA503000 + //string search_value_padded = search_value.Join(".", search_value); + string search_value_padded = ""; + foreach (char ThisChar in search_value) + { + search_value_padded += ThisChar + "."; + } + GForm_Main_0.method_1("Searching:"); + GForm_Main_0.method_1(search_value); + GForm_Main_0.method_1(search_value_padded); + + string search_exact = search_value; + string search_padded = search_value_padded; + //string search_exact = re.compile(".*" + search_value + ".*", flags = re.IGNORECASE | re.MULTILINE | re.DOTALL); //############################### + //string search_padded = re.compile(".*" + search_value_padded + ".*", flags = re.IGNORECASE | re.MULTILINE | re.DOTALL); //############################### + string[] operators = new string[8] { + "fn:^", //XOR + "fn:&", //AND + "fn:|", //OR + "fn:+", //ADD + "fn:-", //SUB + "fn:*", //MUL + "fn:/", //DIV + "fn:%", //MOD + }; + + List keys = new List { }; + + for (int i = 0; i < _keys.Length; i++) { + string k = _keys[i].ToString("x2"); + keys.Add(String.Format("val:" + k + ",sym:" + "k{0}", i)); + } + //assert len(keys) == 3, "excatly three keys currently required!"; + + List firmware_candidates_0 = new List { }; + + string[] key_perms = prnPermut(keys.ToArray()); + string[] op_perms = prnPermutALL(operators); + + //Console.WriteLine(key_perms.Length); + //Console.WriteLine(op_perms.Length); + + List display_ciphers = new List { }; + List attempted_decoders = new List { }; + + int CurrentDone = 0; + foreach (string Line in key_perms) + { + //Console.WriteLine(Line); + string k1 = ""; + string k2 = ""; + string k3 = ""; + string o1 = ""; + string o2 = ""; + string o3 = ""; + string k1_CMD = ""; + string k2_CMD = ""; + string k3_CMD = ""; + string[] SplittedParams = Line.Split('|'); + int DoneCount = 0; + + //Get keys values + foreach (string Commands in SplittedParams) + { + string[] SplittedParamsValue = Commands.Split(','); + + if (SplittedParamsValue[0].Contains("val")) + { + string thisvalue = SplittedParamsValue[0].Split(':')[1]; + string thiscommand = SplittedParamsValue[1].Split(':')[1]; + if (DoneCount == 0) + { + k1 = thisvalue; + k1_CMD = thiscommand; + } + if (DoneCount == 1) + { + k2 = thisvalue; + k2_CMD = thiscommand; + } + if (DoneCount == 2) + { + k3 = thisvalue; + k3_CMD = thiscommand; + } + DoneCount++; + } + } + //Get operators values + foreach (string LineOP in op_perms) + { + string[] SplittedParamsOP = LineOP.Split('|'); + DoneCount = 0; + foreach (string Commands in SplittedParamsOP) + { + string[] SplittedParamsValue = Commands.Split(','); + + if (SplittedParamsValue[0].Contains("fn")) + { + string thisvalue = SplittedParamsValue[0].Split(':')[1]; + if (DoneCount == 0) o1 = thisvalue; + if (DoneCount == 1) o2 = thisvalue; + if (DoneCount == 2) o3 = thisvalue; + DoneCount++; + } + } + + int Percent = (CurrentDone * 100) / (key_perms.Length * op_perms.Length); + GForm_Main_0.method_4(Percent); + CurrentDone++; + + byte[] decoder = _get_decoder(k1, k2, k3, o1, o2, o3); + if (decoder != null && !attempted_decoders.Contains(decoder)) + { + attempted_decoders.Add(decoder); + + byte[] candidate = new byte[_firmware_encrypted.Length]; + char[] decryptedCharArr = new char[_firmware_encrypted.Length]; + for (int i2 = 0; i2 < _firmware_encrypted.Length; i2++) + { + byte ThisByte = decoder[_firmware_encrypted[i2]]; + candidate[i2] = ThisByte; + decryptedCharArr[i2] = (char) ThisByte; + } + string decrypted = new string(decryptedCharArr); + + if ((decrypted.Contains(search_exact) || decrypted.Contains(search_padded)) && !firmware_candidates_0.Contains(candidate)) + { + GForm_Main_0.method_Log("X"); + firmware_candidates_0.Add(candidate); + display_ciphers.Add(string.Format("(((i {0} {1}) {2} {3}) {4} {5}) & 0xFF", + o1, k1_CMD, + o2, k2_CMD, + o3, k3_CMD)); + } + else + { + GForm_Main_0.method_Log("."); + } + Application.DoEvents(); + } + } + } + + GForm_Main_0.method_1(Environment.NewLine); + foreach (string cipher in display_ciphers) { + GForm_Main_0.method_1(String.Format("cipher: {0}", cipher)); + } + return firmware_candidates_0; + } +} diff --git a/FlashToolTest.csproj b/FlashToolTest.csproj index 29497f9..083dbe3 100644 --- a/FlashToolTest.csproj +++ b/FlashToolTest.csproj @@ -61,6 +61,7 @@ + Form diff --git a/GForm_Main.cs b/GForm_Main.cs index f60c567..8424436 100644 --- a/GForm_Main.cs +++ b/GForm_Main.cs @@ -18,7 +18,13 @@ public class GForm_Main : DarkForm { bool ECU_Unlocked = false; private DarkButton darkButton_Unlock01; + private DarkButton darkButton2; + private OpenFileDialog openFileDialog1; byte Unlocking_Mode = 0x41; + bool WritingBinaryMode = true; //if false we are in writing firmware mode + private DarkButton darkButton3; + GForm_Main GForm_Main_0; + UInt16 block_size = 0; public GForm_Main() { @@ -31,6 +37,10 @@ public class GForm_Main : DarkForm this.darkTextBox_0.Text = this.darkTextBox_0.Text + Environment.NewLine; this.darkTextBox_0.Text = this.darkTextBox_0.Text + Environment.NewLine; this.darkTextBox_0.Text = this.darkTextBox_0.Text + Environment.NewLine; + + GForm_Main_0 = this; + + Class_RWD.Load(ref GForm_Main_0); } @@ -49,10 +59,16 @@ public class GForm_Main : DarkForm //Console.Write(string_3); } - - private void method_1(string string_3) + public void method_Log(string string_3) { - Console.Write(string_3); + this.darkTextBox_0.Text += string_3; + //Console.Write(string_3); + } + + + public void method_1(string string_3) + { + Console.WriteLine(string_3); GForm_Main.Class5 @class = new GForm_Main.Class5(); @class.gform0_0 = this; @class.string_0 = string_3; @@ -105,9 +121,10 @@ public class GForm_Main : DarkForm { using (Device device = api.GetDevice("")) { - using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) - { - MessageFilter messageFilter = new MessageFilter(); + using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) + { + LoadJ2534Channel(channel); + /*MessageFilter messageFilter = new MessageFilter(); messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; messageFilter.Mask = new byte[] { @@ -132,119 +149,66 @@ public class GForm_Main : DarkForm }; MessageFilter filter = messageFilter; channel.StartMsgFilter(filter); - - - byte[] array2 = new byte[] - { - 24, //0x18 - 218, //0xDA - 0, //0x00 -> 0x10|0x11 - 241, //0xF1 - 34, //0x22 -> Read Data by ID (F181) - 241, //0xF1 - 129 //0x81 - }; - array2[2] = GForm_Main.byte_3; - SAE.J2534.Message message = new SAE.J2534.Message(array2, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - byte[] array3 = new byte[] - { - 24, //0x18 - 218, //0xDA - 0, //0x00 -> 0x10|0x11 - 241, //0xF1 - 34, //0x22 -> Read Data by ID (F190) - 241, //0xF1 - 144 //0x90 - }; - array3[2] = GForm_Main.byte_3; - SAE.J2534.Message message2 = new SAE.J2534.Message(array3, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); SConfig[] config = new SConfig[] { new SConfig(Parameter.LOOP_BACK, 1), new SConfig(Parameter.DATA_RATE, 500000) }; - channel.SetConfig(config); - int i = 0; - int num = 0; - int num2 = 0; - this.method_1(Environment.NewLine); - this.method_1("Send:" + GForm_Main.smethod_1(message2.Data) + Environment.NewLine); - channel.SendMessage(message2); + channel.SetConfig(config);*/ //############################################################# - while (true) + //############################################################# + int num2 = 0; + byte[] arraySend1 = new byte[] { - if (num >= 5) - { - num = 0; - channel.SendMessage(message); - this.method_1("Send:" + GForm_Main.smethod_1(message.Data) + Environment.NewLine); - while (true) - { - if (num >= 5) - { - if (num2 == 1) - { - this.method_1("Vehicle is in recovery mode?" + Environment.NewLine); - DarkMessageBox.Show(this, "Failed to retrieve vin number, assuming recovery mode, read disabled", "RECOVERY MODE", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - } - else if (num2 != 2) - { - DarkMessageBox.Show(this, "ECU was not detected. \n\rMake sure you have selected the correct platform and the vehicle is on and your device is plugged in.\n\rProvided you have checked these things. Please send a message to the discord group or the page with your vehicle \n\rDomestic Market, Make, Model,Year,Transmission, and Device you are using to Connect.", "Failed to detect Ecu", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - } - else - { - this.darkButton_Unlock41.Enabled = true; - this.darkButton_Unlock01.Enabled = true; - } - break; - } + 34, //0x22 -> Read Data by ID (F190) + 241, //0xF1 + 144 //0x90 + }; + byte[] Received = SendJ2534Message(channel, arraySend1); - GetMessageResults messages = channel.GetMessages(1, 0x3e8); - if (messages.Result.IsOK()) - { - foreach (SAE.J2534.Message message4 in messages.Messages) - { - this.method_1("Recv:" + GForm_Main.smethod_1(message4.Data) + Environment.NewLine); - - int num6 = GForm_Main.smethod_0(message4.Data, byte_0); - if (num6 != -1) - { - byte[] bytes = new byte[0x10]; - Array.Copy(message4.Data, 7, bytes, 0, 0x10);//error here - this.darkTextBox_2.Text = Encoding.ASCII.GetString(bytes); //Display CAL_ID Number - this.method_1("ID:" + Encoding.ASCII.GetString(bytes) + Environment.NewLine); - this.method_1("Vehicle is Online" + Environment.NewLine); - num2 = 2; - num = 5; - } - } - } - num++; - } - break; - } - - GetMessageResults results = channel.GetMessage(); - if (results.Result.IsOK()) - { - foreach (SAE.J2534.Message message3 in results.Messages) - { - this.method_1("Recv:" + GForm_Main.smethod_1(message3.Data) + Environment.NewLine); - - int num4 = GForm_Main.smethod_0(message3.Data, byte_1); - if (num4 != -1) - { - byte[] bytes = new byte[0x10]; - Array.Copy(message3.Data, 8, bytes, 0, 0x10); - this.darkTextBox_1.Text = Encoding.ASCII.GetString(bytes); //Display VIN number - this.method_1("VIN:" + Encoding.ASCII.GetString(bytes) + Environment.NewLine); - num2 = 1; - num = 5; - } - } - } - num++; + int num4 = GForm_Main.smethod_0(Received, byte_1); + if (num4 != -1) + { + byte[] bytes = new byte[0x10]; + Array.Copy(Received, 8, bytes, 0, 0x10); + this.darkTextBox_1.Text = Encoding.ASCII.GetString(bytes); //Display VIN number + this.method_1("VIN:" + Encoding.ASCII.GetString(bytes) + Environment.NewLine); + num2 = 1; + } + //############################################################# + //############################################################# + arraySend1 = new byte[] + { + 34, //0x22 -> Read Data by ID (F181) + 241, //0xF1 + 129 //0x81 + }; + Received = SendJ2534Message(channel, arraySend1); + int num6 = GForm_Main.smethod_0(Received, byte_0); + if (num6 != -1) + { + byte[] bytes = new byte[0x10]; + Array.Copy(Received, 7, bytes, 0, 0x10); + this.darkTextBox_2.Text = Encoding.ASCII.GetString(bytes); //Display CAL_ID Number + this.method_1("ID:" + Encoding.ASCII.GetString(bytes) + Environment.NewLine); + this.method_1("Vehicle is Online" + Environment.NewLine); + num2 = 2; + } + //############################################################# + if (num2 == 1) + { + this.method_1("Vehicle is in recovery mode?" + Environment.NewLine); + DarkMessageBox.Show(this, "Failed to retrieve vin number, assuming recovery mode, read disabled", "RECOVERY MODE", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + else if (num2 != 2) + { + DarkMessageBox.Show(this, "ECU was not detected.\n\rMake sure you have selected the correct platform and the vehicle is on and your device is plugged in.\n\rProvided you have checked these things. Please send a message to the discord group or the page with your vehicle \n\rDomestic Market, Make, Model,Year,Transmission, and Device you are using to Connect.", "Failed to detect Ecu", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + else + { + this.darkButton_Unlock41.Enabled = true; + this.darkButton_Unlock01.Enabled = true; } } } @@ -368,7 +332,8 @@ public class GForm_Main : DarkForm { using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) { - MessageFilter messageFilter = new MessageFilter(); + LoadJ2534Channel(channel); + /*MessageFilter messageFilter = new MessageFilter(); messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; messageFilter.Mask = new byte[] { @@ -393,153 +358,101 @@ public class GForm_Main : DarkForm }; MessageFilter filter = messageFilter; channel.StartMsgFilter(filter); - byte[] array2 = new byte[] - { - 24, //0x18 - 218, //0xDA - 0, //0x00 -> 0x10|0x11 - 241, //0xF1 - 16, //0x10 - 3 //0x03 Not supposed to be 02 or FB?? ########################################## - }; - array2[2] = GForm_Main.byte_3; - SAE.J2534.Message message = new SAE.J2534.Message(array2, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - byte[] array3 = new byte[] - { - 24, //0x18 - 218, //0xDA - 0, //0x00 -> 0x10|0x11 - 241, //0xF1 - 39, //0x27 - 65 //0x41 Not supposed to be 05?? -> could be 0x01 0x03 0x05 0x07 or 0x41 - }; - byte SeedSendByte = this.Unlocking_Mode; - array3[2] = GForm_Main.byte_3; - array3[5] = SeedSendByte; - SAE.J2534.Message message2 = new SAE.J2534.Message(array3, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); SConfig[] config = new SConfig[] { new SConfig(Parameter.LOOP_BACK, 1), new SConfig(Parameter.DATA_RATE, 500000) }; - channel.SetConfig(config); - device.SetProgrammingVoltage(Pin.PIN_12, 5000); - channel.SendMessage(message); - this.backgroundWorker_1.ReportProgress(0, "TX Bytes:" + GForm_Main.smethod_1(message.Data) + Environment.NewLine); + channel.SetConfig(config);*/ - this.method_1("Send:" + GForm_Main.smethod_1(message.Data) + Environment.NewLine); - GetMessageResults messages = channel.GetMessages(3, 1000); - if (messages.Result.IsOK()) + device.SetProgrammingVoltage(Pin.PIN_12, 5000); + + byte[] arraySend1 = new byte[] + { + 16, //0x10 + 3 //0x03 Not supposed to be 02 or FB?? ########################################## + }; + byte[] Received = SendJ2534Message(channel, arraySend1); + if (Received != null) { this.method_1("Diag Mode Set" + Environment.NewLine); - this.backgroundWorker_1.ReportProgress(0, "Diag Mode Set" + Environment.NewLine); - foreach (SAE.J2534.Message message3 in messages.Messages) - { - this.backgroundWorker_1.ReportProgress(0, "RX Bytes:" + GForm_Main.smethod_1(message3.Data) + Environment.NewLine); - this.method_1("Recv:" + GForm_Main.smethod_1(message3.Data) + Environment.NewLine); - } } - else + //################################################################ + arraySend1 = new byte[] { - this.method_1("Result NOT OK(#1)!!" + Environment.NewLine); - } - channel.SendMessage(message2); + 39, //0x27 + 65 //0x41 Not supposed to be 05?? -> could be 0x01 0x03 0x05 0x07 or 0x41 + }; + byte SeedSendByte = this.Unlocking_Mode; + arraySend1[1] = SeedSendByte; this.method_1("Requesting Seed" + Environment.NewLine); - this.backgroundWorker_1.ReportProgress(0, "Requesting Seed"); - this.backgroundWorker_1.ReportProgress(0, "TX Bytes:" + GForm_Main.smethod_1(message2.Data)); - this.method_1("Send:" + GForm_Main.smethod_1(message2.Data) + Environment.NewLine); + Received = SendJ2534Message(channel, arraySend1); + byte[] byte_ = new byte[] { 103, //0x67 65 //0x41 }; - byte_[1] = SeedSendByte; //######################## + byte_[1] = SeedSendByte; byte[] array6 = new byte[4]; bool TwoBytesMode = false; byte b = 1; - messages = channel.GetMessages(3, 1000); - if (messages.Result.IsOK()) - { - foreach (SAE.J2534.Message message4 in messages.Messages) - { - this.method_1("Recv:" + GForm_Main.smethod_1(message4.Data) + Environment.NewLine); - int num = GForm_Main.smethod_2(message4.Data, byte_, 0); - if (num > 0) - { - if (message4.Data.Length < 10) - { - array6 = new byte[2]; - TwoBytesMode = true; - } - int index = 0; - while (true) - { - if ((!TwoBytesMode && index >= 4) || (TwoBytesMode && index >= 2)) - { - if (!TwoBytesMode) - { - b = message4.Data[(index + num) + 2]; - Array.Reverse(array6); - } - this.method_1("Security Request - Seed Bytes:" + GForm_Main.smethod_1(array6) + Environment.NewLine); - this.backgroundWorker_1.ReportProgress(0, "Security Request - Seed Bytes:" + GForm_Main.smethod_1(array6)); - if (!TwoBytesMode) - { - this.method_1("Security Request - Algorithm:" + b.ToString("X2") + Environment.NewLine); - this.backgroundWorker_1.ReportProgress(0, "Security Request - Algorithm:" + b.ToString("X2")); - } - break; - } - array6[index] = message4.Data[(index + num) + 2]; - index++; - } + if (Received != null) + { + int num = GForm_Main.smethod_2(Received, byte_, 0); + if (num > 0) + { + if (Received.Length < 10) + { + array6 = new byte[2]; + TwoBytesMode = true; + } + int index = 0; + while (true) + { + if ((!TwoBytesMode && index >= 4) || (TwoBytesMode && index >= 2)) + { + if (!TwoBytesMode) + { + b = Received[(index + num) + 2]; + Array.Reverse(array6); + } + + this.method_1("Security Request - Seed Bytes:" + GForm_Main.smethod_1(array6) + Environment.NewLine); + if (!TwoBytesMode) this.method_1("Security Request - Algorithm:" + b.ToString("X2") + Environment.NewLine); + break; + } + array6[index] = Received[(index + num) + 2]; + index++; } - this.backgroundWorker_1.ReportProgress(0, "RX Bytes:" + GForm_Main.smethod_1(message4.Data) + Environment.NewLine); } } - else - { - this.method_1("Result NOT OK(#2)!!" + Environment.NewLine); - } + if (array6[0] != 0) { uint value = 0; - if (!TwoBytesMode) - { - value = Class_Cypher.GetKey41(BitConverter.ToUInt32(array6, 0), b); - } - else - { - value = Class_Cypher.GetKey01(array6, darkTextBox_2.Text); - } - byte[] bytes = BitConverter.GetBytes(value); + if (!TwoBytesMode) value = Class_Cypher.GetKey41(BitConverter.ToUInt32(array6, 0), b); + else value = Class_Cypher.GetKey01(array6, darkTextBox_2.Text); - this.backgroundWorker_1.ReportProgress(0, "Security Request - Key Bytes from app:" + GForm_Main.smethod_1(bytes)); + byte[] bytes = BitConverter.GetBytes(value); this.method_1("Security Request - Key to Send:" + GForm_Main.smethod_1(bytes) + Environment.NewLine); - byte[] bytes2 = BitConverter.GetBytes(value); - - byte[] array7 = new byte[] + arraySend1 = new byte[] { - 24, //0x18 - 218, //0xDA - 0, //0x00 -> 0x10|0x11 - 241, //0xF1 39, //0x27 66 //0x42 }; - array7[2] = GForm_Main.byte_3; - array7[5] = (byte)(SeedSendByte + 1); //#################### - byte[] array8 = array7; + arraySend1[1] = (byte)(SeedSendByte + 1); + byte[] array8 = arraySend1; if (!TwoBytesMode) Array.Resize(ref array8, array8.Length + 5); if (TwoBytesMode) Array.Resize(ref array8, array8.Length + 2); - array8[6] = bytes2[0]; //SecurityKey Byte1 - array8[7] = bytes2[1]; //SecurityKey Byte2 + array8[6] = bytes[0]; //SecurityKey Byte1 + array8[7] = bytes[1]; //SecurityKey Byte2 if (!TwoBytesMode) { - array8[8] = bytes2[2]; //SecurityKey Byte3 - array8[9] = bytes2[3]; //SecurityKey Byte4 + array8[8] = bytes[2]; //SecurityKey Byte3 + array8[9] = bytes[3]; //SecurityKey Byte4 array8[10] = b; //Algorithm Byte } byte[] byte_2 = new byte[] @@ -547,133 +460,104 @@ public class GForm_Main : DarkForm 103, //0x67 66 //0x42 }; - byte_2[1] = (byte)(SeedSendByte + 1); //#################### - SAE.J2534.Message message5 = new SAE.J2534.Message(array8, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - this.backgroundWorker_1.ReportProgress(0, "TX Bytes:" + GForm_Main.smethod_1(message5.Data)); - this.method_1("Send:" + GForm_Main.smethod_1(message5.Data) + Environment.NewLine); - channel.SendMessage(message5); - bool flag = false; - messages = channel.GetMessages(3); - if (messages.Result.IsOK()) + byte_2[1] = (byte)(SeedSendByte + 1); + + Received = SendJ2534Message(channel, array8); + + if (Received != null) { - foreach (SAE.J2534.Message message6 in messages.Messages) + int num = GForm_Main.smethod_2(Received, byte_2, 0); //looking for 0x67, 0x42 + if (num > 0) { - int num = GForm_Main.smethod_2(message6.Data, byte_2, 0); //looking for 0x67, 0x42 - int num2 = GForm_Main.smethod_2(message6.Data, this.byte_5, 0); //looking for 0x11, 0x7F - if (num2 > 0) - { - for (int k = 0; k < 2; k++) - { - this.byte_6[k] = message6.Data[k + num2 + 2]; //0x27, 0x35 - } - string str = "Response:"; - Class_ODB.Mode mode = (Class_ODB.Mode)this.byte_6[0]; - string str2 = mode.ToString(); - Class_ODB.NegativeResponse negativeResponse = (Class_ODB.NegativeResponse)this.byte_6[1]; - this.method_1(str + "|" + str2 + "|" + negativeResponse.ToString() + Environment.NewLine); - } - if (num > 0) - { - this.backgroundWorker_1.ReportProgress(0, "Security Authorized: ECU Unlocked" + Environment.NewLine); - this.method_1("Security Authorized: ECU Unlocked" + Environment.NewLine); - flag = true; - ECU_Unlocked = true; - this.darkButton_DownloadROM.Enabled = true; - this.darkButton_5.Enabled = true; - } - else - { - this.method_1("Recv:" + GForm_Main.smethod_1(message6.Data) + Environment.NewLine); - this.backgroundWorker_1.ReportProgress(0, "RX Bytes:" + GForm_Main.smethod_1(message6.Data) + Environment.NewLine); - } + this.method_1("Security Authorized: ECU Unlocked" + Environment.NewLine); + ECU_Unlocked = true; + this.darkButton_DownloadROM.Enabled = true; + this.darkButton_5.Enabled = true; } - } - else - { - this.method_1("Result NOT OK(#3)!!" + Environment.NewLine); - } - if (!flag) - { - MessageBox.Show("Failed to Unlock ECU, Check Log"); - } - else - { - //################################################################################## - //################################################################################## - if (TwoBytesMode) + else { - /*byte[] arrayProgrammingCommand = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241, //0xF1 - 16, //0x10 - 2 //0x02 - }; - SAE.J2534.Message messageProgramming = new SAE.J2534.Message(arrayProgrammingCommand, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - channel.SendMessage(messageProgramming); - this.method_1("Send:" + GForm_Main.smethod_1(messageProgramming.Data) + Environment.NewLine); - - GetMessageResults messagesProgramming = channel.GetMessages(3, 1000); - if (messagesProgramming.Result.IsOK()) - { - this.method_1("Programming Mode Set" + Environment.NewLine); - foreach (SAE.J2534.Message message3 in messagesProgramming.Messages) - { - this.method_1("Recv:" + GForm_Main.smethod_1(message3.Data) + Environment.NewLine); - } - } - else - { - this.method_1("Result NOT OK(#1)!!" + Environment.NewLine); - }*/ - - //################################# - /*UInt16 testval = 0xF101; - byte[] BytesVal = BitConverter.GetBytes(testval); - UInt16 Val16 = ToUInt16BE(BytesVal); - BytesVal = BitConverter.GetBytes(Val16);*/ - - /*byte[] arrayReadDataIDCommand = new byte[] - { - 24, //0x18 - 218, //0xDA - GForm0.byte_3, //0x00 -> 0x10|0x11 - 241, //0xF1 - 0x22, //0x22 -> Read Data by ID (F101) - 0xF1, //BytesVal[0], //0xXX - 0x01 //BytesVal[1], //0xXX - }; - SAE.J2534.Message messageReadID = new SAE.J2534.Message(arrayReadDataIDCommand, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - channel.SendMessage(messageReadID); - this.method_1("Send:" + GForm0.smethod_1(messageReadID.Data) + Environment.NewLine); - - GetMessageResults messagesReadID = channel.GetMessages(3, 1000); - if (messagesReadID.Result.IsOK()) - { - this.method_1("read_data_by_identifier Set" + Environment.NewLine); - foreach (SAE.J2534.Message message3 in messagesReadID.Messages) - { - this.method_1("Recv:" + GForm0.smethod_1(message3.Data) + Environment.NewLine); - } - } - else - { - this.method_1("Result NOT OK(#1)!!" + Environment.NewLine); - }*/ + this.method_1("Recv:" + GForm_Main.smethod_1(Received) + Environment.NewLine); + ECU_Unlocked = false; + this.darkButton_DownloadROM.Enabled = false; + this.darkButton_5.Enabled = false; + MessageBox.Show("Failed to Unlock ECU, Check Log"); } } } else { - this.method_1("Result NOT OK(#4)!!" + Environment.NewLine); + this.method_1("Result NOT OK!!" + Environment.NewLine); } } } } } + public byte[] SendJ2534Message(Channel channel, byte[] MessageBytes) + { + byte[] arrayCommand = new byte[] + { + 24, //0x18 + 218, //0xDA + GForm_Main.byte_3, //0x00 -> 0x10|0x11 + 241 //0xF1 + }; + + //Add the rest of the messages bytes to the final array + byte[] arrayCommandFinal = new byte[arrayCommand.Length + MessageBytes.Length]; + int MessageIndex = 0; + for (int i = 0; i < arrayCommand.Length; i++) + { + arrayCommandFinal[MessageIndex] = arrayCommand[i]; + MessageIndex++; + } + for (int i = 0; i < MessageBytes.Length; i++) + { + arrayCommandFinal[MessageIndex] = MessageBytes[i]; + MessageIndex++; + } + + //Send message + SAE.J2534.Message messageCommands = new SAE.J2534.Message(arrayCommand, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); + channel.SendMessage(messageCommands); + this.method_1("Send:" + GForm_Main.smethod_1(messageCommands.Data) + Environment.NewLine); + + //Receive message + GetMessageResults messagesReceived = channel.GetMessages(3, 1000); + if (messagesReceived.Result.IsOK()) + { + //this.method_1("Programming Mode Set!" + Environment.NewLine); + int IndexReceived = 1; + foreach (SAE.J2534.Message message3 in messagesReceived.Messages) + { + //Gather Negative Responce + int num2 = GForm_Main.smethod_2(message3.Data, this.byte_5, 0); //looking for 0x11, 0x7F + if (num2 > 0) + { + for (int k = 0; k < 2; k++) + { + this.byte_6[k] = message3.Data[k + num2 + 2]; //0x27, 0x35 + } + Class_ODB.Mode mode = (Class_ODB.Mode)this.byte_6[0]; + string str2 = mode.ToString(); + Class_ODB.NegativeResponse negativeResponse = (Class_ODB.NegativeResponse)this.byte_6[1]; + this.method_1("BAD Response: " + str2 + "|" + negativeResponse.ToString() + Environment.NewLine); + } + if (IndexReceived >= 3) + { + this.method_1("Recv:" + GForm_Main.smethod_1(message3.Data) + Environment.NewLine); + return message3.Data; //after 3messages received, return the last messages bytes + } + IndexReceived++; + } + } + else + { + this.method_1("Result NOT OK!!" + Environment.NewLine); + } + return null; + } + public void method_ReadROM(object sender, DoWorkEventArgs e) { using (API api = APIFactory.GetAPI(GForm_Main.string_0)) @@ -684,37 +568,38 @@ public class GForm_Main : DarkForm { using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) { - MessageFilter messageFilter = new MessageFilter(); + LoadJ2534Channel(channel); + /*MessageFilter messageFilter = new MessageFilter(); messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; messageFilter.Mask = new byte[] { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue + byte.MaxValue, + byte.MaxValue, + byte.MaxValue, + byte.MaxValue }; messageFilter.Pattern = new byte[] { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 + 24, //0x18 + 218, //0xDA + 241, //0xF1 + GForm_Main.byte_3 //0x00 }; messageFilter.FlowControl = new byte[] { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 + 24, //0x18 + 218, //0xDA + GForm_Main.byte_3, //0x00 -> 0x10|0x11 + 241 //0xF1 }; MessageFilter filter = messageFilter; channel.StartMsgFilter(filter); SConfig[] config = new SConfig[] { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) + new SConfig(Parameter.LOOP_BACK, 1), + new SConfig(Parameter.DATA_RATE, 500000) }; - channel.SetConfig(config); + channel.SetConfig(config);*/ device.SetProgrammingVoltage(Pin.PIN_12, 5000); @@ -889,12 +774,9 @@ public class GForm_Main : DarkForm public void method_12(uint uint_0, uint uint_1, out byte[] byte_12, Channel channel_0) { byte_12 = new byte[1]; - SAE.J2534.Message message = new SAE.J2534.Message(new byte[] + + byte[] arraySend1 = new byte[] { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, - 241, //0xF1 35, //0x23 -> Read_data_by_address 20, //0x14 (byte)((uint_0 >> 0x18) & 0xff), @@ -902,28 +784,24 @@ public class GForm_Main : DarkForm (byte)((uint_0 >> 8) & 0xff), (byte)(uint_0 & 0xff), 4 - }, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - - channel_0.SendMessage(message); - this.method_1("Send:" + GForm_Main.smethod_1(message.Data) + Environment.NewLine); - GetMessageResults messages = channel_0.GetMessages(3); + }; byte[] byte_13 = new byte[] { GForm_Main.byte_3, 99 }; - if (messages.Result != ResultCode.DEVICE_NOT_CONNECTED) + + byte[] Received = SendJ2534Message(channel_0, arraySend1); + if (Received != null) { - foreach (SAE.J2534.Message message2 in messages.Messages) + //if (messages.Result != ResultCode.DEVICE_NOT_CONNECTED) + //{ + int num = GForm_Main.smethod_2(Received, byte_13, 0); + if (num > 0) { - this.method_1("Recv:" + GForm_Main.smethod_1(message2.Data) + Environment.NewLine); - int num = GForm_Main.smethod_2(message2.Data, byte_13, 0); - if (num > 0) - { - num += 2; - Array.Resize(ref byte_12, message2.Data.Length - num); - Array.Copy(message2.Data, num, byte_12, 0, message2.Data.Length - num); - } + num += 2; + Array.Resize(ref byte_12, Received.Length - num); + Array.Copy(Received, num, byte_12, 0, Received.Length - num); } } } @@ -1074,32 +952,47 @@ public class GForm_Main : DarkForm return (int)b; } + public int GetChecksum(byte[] byte_1) + { + byte b = 0; + for (int i = 0; i < byte_1.Length; i++) + { + if (i != 33792) //0x8400 + { + b -= byte_1[i]; + } + } + return (int)b; + } + private void method_17(object sender, EventArgs e) { using (OpenFileDialog dialog = new OpenFileDialog()) { - dialog.Filter = "All files (*.*)|*.*"; - //dialog.Filter = "All files (*.*)|*.*|calibration files (*.khts)|*.khts"; + dialog.Filter = "Honda Binary ROM File|*.bin"; dialog.FilterIndex = 1; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == DialogResult.OK) { string string_Filename = dialog.FileName; - if (Path.GetExtension(string_Filename).ToUpper() != ".KHTS") + byte_ToWrite = File.ReadAllBytes(string_Filename); + WritingBinaryMode = true; + + //############################### + //Get Checksum and Fix it + int num = (int) byte_ToWrite[33792]; + int num2 = this.GetChecksum(byte_ToWrite); + if (num != num2) { - byte_ToWrite = File.ReadAllBytes(string_Filename); - } - else - { - /*Class39_0.smethod_17(string_Filename); - int num2 = Check_Checksum(Class39_0.byte_0); - if ((Class39_0.byte_0[0x8400] != num2) && (MessageBox.Show("Checksum is incorrect do you want to fix it?", "Flash Tool", MessageBoxButtons.YesNo) == DialogResult.Yes)) + DialogResult dialogResult = MessageBox.Show("Checksum miss match." + Environment.NewLine + "Do you want to correct it?", "Checksum Error.", MessageBoxButtons.YesNo, MessageBoxIcon.Hand); + if (dialogResult == DialogResult.Yes) { - Class39_0.byte_0[0x8400] = (byte)num2; + byte_ToWrite[33792] = (byte)num2; } - Buffer.BlockCopy(Class39_0.byte_0, 0x8000, FileBytes, 0, 0xf8000);*/ } + //############################### + if (MessageBox.Show("Are you sure you want to write this file to ECU?", "Flash Tool", MessageBoxButtons.YesNo) == DialogResult.Yes) { this.backgroundWorker_0 = new BackgroundWorker(); @@ -1113,6 +1006,86 @@ public class GForm_Main : DarkForm } } + + private void darkButton3_Click(object sender, EventArgs e) + { + using (OpenFileDialog dialog = new OpenFileDialog()) + { + dialog.Filter = "Honda Compressed Firmware RWD File|*.gz|Honda Firmware RWD File|*.rwd"; + dialog.FilterIndex = 1; + dialog.RestoreDirectory = true; + if (dialog.ShowDialog() == DialogResult.OK) + { + string string_Filename = dialog.FileName; + if (Path.GetExtension(string_Filename).ToLower().Contains("gz")) byte_ToWrite = Class_RWD.Decompress(string_Filename); + else byte_ToWrite = File.ReadAllBytes(string_Filename); + WritingBinaryMode = false; + + //Decrypt firmware file and get needed variable (Decryption byte) + Class_RWD.LoadRWD(openFileDialog1.FileName, false); + + //############################### + //Get Checksum and Fix it + /*int num = (int)byte_ToWrite[33792]; + int num2 = this.GetChecksum(byte_ToWrite); + if (num != num2) + { + DialogResult dialogResult = MessageBox.Show("Checksum miss match." + Environment.NewLine + "Do you want to correct it?", "Checksum Error.", MessageBoxButtons.YesNo, MessageBoxIcon.Hand); + if (dialogResult == DialogResult.Yes) + { + byte_ToWrite[33792] = (byte)num2; + } + }*/ + //############################### + + if (MessageBox.Show("Are you sure you want to write this file to ECU?", "Flash Tool", MessageBoxButtons.YesNo) == DialogResult.Yes) + { + this.backgroundWorker_0 = new BackgroundWorker(); + this.backgroundWorker_0.WorkerReportsProgress = true; + this.backgroundWorker_0.DoWork += new DoWorkEventHandler(this.backgroundWorker_0_DoWork_1); + this.backgroundWorker_0.ProgressChanged += new ProgressChangedEventHandler(this.method_18); + this.backgroundWorker_0.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.method_19); + this.backgroundWorker_0.RunWorkerAsync(); + } + } + } + } + + private void LoadJ2534Channel(Channel channel) + { + MessageFilter messageFilter = new MessageFilter(); + messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; + messageFilter.Mask = new byte[] + { + byte.MaxValue, + byte.MaxValue, + byte.MaxValue, + byte.MaxValue + }; + messageFilter.Pattern = new byte[] + { + 24, //0x18 + 218, //0xDA + 241, //0xF1 + GForm_Main.byte_3 //0x00 + }; + messageFilter.FlowControl = new byte[] + { + 24, //0x18 + 218, //0xDA + GForm_Main.byte_3, //0x00 -> 0x10|0x11 + 241 //0xF1 + }; + MessageFilter filter = messageFilter; + channel.StartMsgFilter(filter); + SConfig[] config = new SConfig[] + { + new SConfig(Parameter.LOOP_BACK, 1), + new SConfig(Parameter.DATA_RATE, 500000) + }; + channel.SetConfig(config); + } + private unsafe void backgroundWorker_0_DoWork_1(object sender, DoWorkEventArgs e) { using (API api = APIFactory.GetAPI(GForm_Main.string_0)) @@ -1123,39 +1096,38 @@ public class GForm_Main : DarkForm { using (Channel channel = device.GetChannel(Protocol.ISO15765, Baud.CAN, ConnectFlag.CAN_29BIT_ID, false)) { - MessageFilter messageFilter = new MessageFilter(); + LoadJ2534Channel(channel); + /*MessageFilter messageFilter = new MessageFilter(); messageFilter.FilterType = Filter.FLOW_CONTROL_FILTER; messageFilter.Mask = new byte[] { - byte.MaxValue, - byte.MaxValue, - byte.MaxValue, - byte.MaxValue + byte.MaxValue, + byte.MaxValue, + byte.MaxValue, + byte.MaxValue }; messageFilter.Pattern = new byte[] { - 24, //0x18 - 218, //0xDA - 241, //0xF1 - GForm_Main.byte_3 //0x00 + 24, //0x18 + 218, //0xDA + 241, //0xF1 + GForm_Main.byte_3 //0x00 }; messageFilter.FlowControl = new byte[] { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, //0x00 -> 0x10|0x11 - 241 //0xF1 + 24, //0x18 + 218, //0xDA + GForm_Main.byte_3, //0x00 -> 0x10|0x11 + 241 //0xF1 }; MessageFilter filter = messageFilter; channel.StartMsgFilter(filter); SConfig[] config = new SConfig[] { - new SConfig(Parameter.LOOP_BACK, 1), - new SConfig(Parameter.DATA_RATE, 500000) + new SConfig(Parameter.LOOP_BACK, 1), + new SConfig(Parameter.DATA_RATE, 500000) }; - channel.SetConfig(config); - - device.SetProgrammingVoltage(Pin.PIN_12, 5000); + channel.SetConfig(config);*/ if (!ECU_Unlocked) { @@ -1163,13 +1135,112 @@ public class GForm_Main : DarkForm } else { + device.SetProgrammingVoltage(Pin.PIN_12, 5000); + + //Send WRITE_DATA_BY_IDENTIFIER for firmware (.rwd) writing mode + if (!WritingBinaryMode) + { + //Set Programming Mode + byte[] arraySend1 = new byte[] + { + 16, //0x10 + 2 //0x02 + }; + + byte[] Received = SendJ2534Message(channel, arraySend1); + if (Received != null) + { + this.method_1("Programming Mode Set!" + Environment.NewLine); + } + //################### + //Erase Memory + //31-01-FF-00 + arraySend1 = new byte[] + { + 0x31, //0x31 + 0x01, //0x01 + 0xFF, //0xFF + 0x00 //0x00 + }; + + Received = SendJ2534Message(channel, arraySend1); + if (Received != null) + { + this.method_1("Memory Erased!" + Environment.NewLine); + } + //################### + //Set WRITE_DATA_BY_IDENTIFIER + arraySend1 = new byte[] + { + 0x2E, //0x22 -> Write Data by ID (F101) + 0xF1, //0xF1 + 0x01, //0x01 + Class_RWD._keys[0], //Key1 + Class_RWD._keys[1], //Key2 + Class_RWD._keys[2] //Key3 + }; + + Received = SendJ2534Message(channel, arraySend1); + if (Received != null) + { + this.method_1("WRITE_DATA_BY_IDENTIFIER Set!" + Environment.NewLine); + } + //################### + //Request Download + byte Addrr = 0x04; + uint memory_address = Class_RWD.start; + uint memory_size = Class_RWD.size; + arraySend1 = new byte[] + { + 0x34, //0x34 + 0x00, //0x00 + Addrr, //0x04 + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00, //0x00 -> Set later + 0x00 //0x00 -> Set later + }; + arraySend1[2] = (byte) ((Addrr << 4) | Addrr); + //if (memory_address >= Math.Pow(2 ^ Addrr * 8)) throw new Exception(string.Format("invalid memory_address: 0x{0}", memory_address.ToString("X4"))); + if (memory_address >= Math.Pow(2, Addrr * 8)) throw new Exception(string.Format("invalid memory_address: 0x{0}", memory_address.ToString("X4"))); + for (int i = 0; i < Addrr; i++) + { + uint b = (memory_address >> ((Addrr - i - 1) * 8)) & 0xFF; + arraySend1[3 + i] = (byte) b; + } + + if (memory_size >= Math.Pow(2, Addrr * 8)) throw new Exception(string.Format("invalid memory_size: 0x{0}", memory_size.ToString("X4"))); + for (int i = 0; i < Addrr; i++) + { + uint b = (memory_size >> ((Addrr - i - 1) * 8)) & 0xFF; + arraySend1[3 + Addrr + i] = (byte)b; + } + + Received = SendJ2534Message(channel, arraySend1); + if (Received != null) + { + this.method_1("Request download done" + Environment.NewLine); + //block_size = ; + } + } + Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.WriteROMtoECU(channel, byte_ToWrite, this.backgroundWorker_0); stopwatch.Stop(); + if (!WritingBinaryMode) + { + //Request transfer exit && routine control: check dependencies + this.method_13_Close(channel); + } + TimeSpan timeSpan = TimeSpan.FromMilliseconds((double)stopwatch.ElapsedMilliseconds); - this.backgroundWorker_0.ReportProgress(0, "Successfully read " + this.byte_7.Length + "bytes of flash memory in " + timeSpan.Minutes + ":" + timeSpan.Seconds); + this.backgroundWorker_0.ReportProgress(0, "Successfully write " + this.byte_7.Length + "bytes of flash memory in " + timeSpan.Minutes + ":" + timeSpan.Seconds); device.SetProgrammingVoltage(Pin.PIN_12, -1); //Set 0V on Pin12 } } @@ -1184,7 +1255,9 @@ public class GForm_Main : DarkForm public void WriteROMtoECU(Channel channel_0, byte[] byte_5, BackgroundWorker backgroundWorker_X = null) { - if (byte_5.Length < 1015808) + //Get valid addresses for Firmware writing (get Start address) + + if (byte_5.Length < 1015808 && WritingBinaryMode) { return; } @@ -1206,64 +1279,37 @@ public class GForm_Main : DarkForm backgroundWorker_X.ReportProgress((int)((float)i / 1015808f * 100f)); } } - this.method_13(channel_0); + this.method_13_Close(channel_0); } - public void method_13(Channel channel_0) + public void method_13_Close(Channel channel_0) { - SAE.J2534.Message message = new SAE.J2534.Message(new byte[] + byte[] arraySend1 = new byte[] { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, - 241, //0xF1 0x37 //0x37 - }, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - - channel_0.SendMessage(message); - - bool flag = false; + }; byte[] buffer2 = new byte[] { GForm_Main.byte_3, 0x77 }; - while (!flag) + + byte[] Received = SendJ2534Message(channel_0, arraySend1); + if (Received != null) { - GetMessageResults results2 = channel_0.GetMessages(3); - int num3 = -1; - if (results2.Result != ResultCode.DEVICE_NOT_CONNECTED) + int num3 = GForm_Main.smethod_2(Received, buffer2, 0); + if (num3 > 0) { - foreach (SAE.J2534.Message message3 in results2.Messages) - { - num3 = GForm_Main.smethod_2(message3.Data, buffer2, 0); - if (num3 > 0) - { - flag = true; - this.backgroundWorker_0.ReportProgress(0, "Transfer Exited" + Environment.NewLine); - break; - } - } + this.method_1("Transfer Exited" + Environment.NewLine); } - } - SAE.J2534.Message message2 = new SAE.J2534.Message(new byte[] - { - 24, //0x18 - 218, //0xDA - GForm_Main.byte_3, - 241, //0xF1 - 0x31, //0x31 - 1, //0x01 - 0xff, //0xff - 1 //0x01 - }, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); - - channel_0.SendMessage(message2); - int num2 = 0; - GetMessageResults messages = channel_0.GetMessages(3); - if (messages.Result != ResultCode.DEVICE_NOT_CONNECTED) - { - SAE.J2534.Message[] messageArray2 = messages.Messages; - for (int i = 0; i < messageArray2.Length; i++) + arraySend1 = new byte[] { - num2++; + 0x31, //0x31 + 1, //0x01 + 0xff, //0xff + 1 //0x01 + }; + Received = SendJ2534Message(channel_0, arraySend1); + if (Received != null) + { + this.method_1("Routine control check dependencies" + Environment.NewLine); } } } @@ -1275,7 +1321,16 @@ public class GForm_Main : DarkForm int_25 = int_24; } - byte[] data = new byte[] { 0x18, 0xDA, GForm_Main.byte_3, 0xF1, 0x36, byte_6X }; + //Transfer Data (0x36) + byte[] data = new byte[] + { + 0x18, + 0xDA, + GForm_Main.byte_3, + 0xF1, + 0x36, + byte_6X + }; Buffer.BlockCopy(byte_5X, int_23, data, 6, int_25); SAE.J2534.Message message = new SAE.J2534.Message(data, TxFlag.CAN_29BIT_ID | TxFlag.ISO15765_FRAME_PAD); channel_0.SendMessage(message); @@ -1362,6 +1417,8 @@ public class GForm_Main : DarkForm this.darkButton_DownloadROM = new DarkUI.Controls.DarkButton(); this.darkButton_0 = new DarkUI.Controls.DarkButton(); this.darkGroupBox_0 = new DarkUI.Controls.DarkGroupBox(); + this.darkButton2 = new DarkUI.Controls.DarkButton(); + this.darkButton_Unlock01 = new DarkUI.Controls.DarkButton(); this.darkButton_Unlock41 = new DarkUI.Controls.DarkButton(); this.darkButton1 = new DarkUI.Controls.DarkButton(); this.darkButton_6 = new DarkUI.Controls.DarkButton(); @@ -1382,7 +1439,8 @@ public class GForm_Main : DarkForm this.darkLabel_7 = new DarkUI.Controls.DarkLabel(); this.darkLabel_8 = new DarkUI.Controls.DarkLabel(); this.darkCheckBox_0 = new DarkUI.Controls.DarkCheckBox(); - this.darkButton_Unlock01 = new DarkUI.Controls.DarkButton(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.darkButton3 = new DarkUI.Controls.DarkButton(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_0)).BeginInit(); this.darkGroupBox_0.SuspendLayout(); this.SuspendLayout(); @@ -1441,7 +1499,7 @@ public class GForm_Main : DarkForm // this.darkButton_0.Checked = false; this.darkButton_0.Enabled = false; - this.darkButton_0.Location = new System.Drawing.Point(6, 271); + this.darkButton_0.Location = new System.Drawing.Point(6, 300); this.darkButton_0.Name = "darkButton_0"; this.darkButton_0.Size = new System.Drawing.Size(192, 23); this.darkButton_0.TabIndex = 50; @@ -1452,6 +1510,8 @@ public class GForm_Main : DarkForm // darkGroupBox_0 // this.darkGroupBox_0.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.darkGroupBox_0.Controls.Add(this.darkButton3); + this.darkGroupBox_0.Controls.Add(this.darkButton2); this.darkGroupBox_0.Controls.Add(this.darkButton_Unlock01); this.darkGroupBox_0.Controls.Add(this.darkButton_Unlock41); this.darkGroupBox_0.Controls.Add(this.darkButton1); @@ -1470,6 +1530,27 @@ public class GForm_Main : DarkForm this.darkGroupBox_0.TabStop = false; this.darkGroupBox_0.Text = "J2534 Controls"; // + // darkButton2 + // + this.darkButton2.Checked = false; + this.darkButton2.Location = new System.Drawing.Point(6, 358); + this.darkButton2.Name = "darkButton2"; + this.darkButton2.Size = new System.Drawing.Size(192, 23); + this.darkButton2.TabIndex = 59; + this.darkButton2.Text = "Convert .rwd to .bin"; + this.darkButton2.Click += new System.EventHandler(this.darkButton2_Click_1); + // + // darkButton_Unlock01 + // + this.darkButton_Unlock01.Checked = false; + this.darkButton_Unlock01.Enabled = false; + this.darkButton_Unlock01.Location = new System.Drawing.Point(6, 155); + this.darkButton_Unlock01.Name = "darkButton_Unlock01"; + this.darkButton_Unlock01.Size = new System.Drawing.Size(192, 23); + this.darkButton_Unlock01.TabIndex = 58; + this.darkButton_Unlock01.Text = "UNLOCK ECU (0x27,0x01)"; + this.darkButton_Unlock01.Click += new System.EventHandler(this.darkButton_Unlock01_Click); + // // darkButton_Unlock41 // this.darkButton_Unlock41.Checked = false; @@ -1510,7 +1591,7 @@ public class GForm_Main : DarkForm this.darkButton_5.Name = "darkButton_5"; this.darkButton_5.Size = new System.Drawing.Size(192, 23); this.darkButton_5.TabIndex = 54; - this.darkButton_5.Text = "Flash Rom"; + this.darkButton_5.Text = "Flash Rom (.bin)"; this.darkButton_5.Click += new System.EventHandler(this.method_17); // // darkLabel_6 @@ -1527,7 +1608,7 @@ public class GForm_Main : DarkForm // this.darkButton_4.Checked = false; this.darkButton_4.Enabled = false; - this.darkButton_4.Location = new System.Drawing.Point(6, 300); + this.darkButton_4.Location = new System.Drawing.Point(6, 329); this.darkButton_4.Name = "darkButton_4"; this.darkButton_4.Size = new System.Drawing.Size(192, 23); this.darkButton_4.TabIndex = 51; @@ -1666,16 +1747,22 @@ public class GForm_Main : DarkForm this.darkCheckBox_0.Text = "Large Write"; this.darkCheckBox_0.Visible = false; // - // darkButton_Unlock01 + // openFileDialog1 // - this.darkButton_Unlock01.Checked = false; - this.darkButton_Unlock01.Enabled = false; - this.darkButton_Unlock01.Location = new System.Drawing.Point(6, 155); - this.darkButton_Unlock01.Name = "darkButton_Unlock01"; - this.darkButton_Unlock01.Size = new System.Drawing.Size(192, 23); - this.darkButton_Unlock01.TabIndex = 58; - this.darkButton_Unlock01.Text = "UNLOCK ECU (0x27,0x01)"; - this.darkButton_Unlock01.Click += new System.EventHandler(this.darkButton_Unlock01_Click); + this.openFileDialog1.DefaultExt = "*.gz"; + this.openFileDialog1.Filter = "Honda Compressed RWD Firmware|*.gz|Honda RWD Firmware|*.rwd"; + this.openFileDialog1.Title = "Open Honda RWD Firmware File"; + // + // darkButton3 + // + this.darkButton3.Checked = false; + this.darkButton3.Enabled = false; + this.darkButton3.Location = new System.Drawing.Point(6, 271); + this.darkButton3.Name = "darkButton3"; + this.darkButton3.Size = new System.Drawing.Size(192, 23); + this.darkButton3.TabIndex = 60; + this.darkButton3.Text = "Flash Firmware (.rwd)"; + this.darkButton3.Click += new System.EventHandler(this.darkButton3_Click); // // GForm_Main // @@ -2022,4 +2109,13 @@ public class GForm_Main : DarkForm public double double_0; } + + private void darkButton2_Click_1(object sender, EventArgs e) + { + DialogResult result = openFileDialog1.ShowDialog(); + if (result == DialogResult.OK) + { + Class_RWD.LoadRWD(openFileDialog1.FileName, true); + } + } } diff --git a/GForm_Main.resx b/GForm_Main.resx index 078bc37..0a4650f 100644 --- a/GForm_Main.resx +++ b/GForm_Main.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + diff --git a/GForm_PlatformSelect.cs b/GForm_PlatformSelect.cs index 7df7a66..2245f3f 100644 --- a/GForm_PlatformSelect.cs +++ b/GForm_PlatformSelect.cs @@ -33,7 +33,8 @@ public class GForm_PlatformSelect : DarkForm { this.list_0[i].Processor, this.list_0[i].RomSize_String, - this.list_0[i].ECU_Byte_String + this.list_0[i].ECU_Byte_String, + this.list_0[i].TransmissionType }); this.dataGridView_0.Rows.Add(dataGridViewRow); } @@ -43,12 +44,12 @@ public class GForm_PlatformSelect : DarkForm private void method_1() { - this.list_0.Add(new Class_ECUS("1MB", "SH7058", 16, "0x10", 1048576, 1015808)); - this.list_0.Add(new Class_ECUS("1MB", "SH7058", 17, "0x11", 1048576, 1015808)); - this.list_0.Add(new Class_ECUS("1MB", "SH7058", 14, "0x0E", 1048576, 1015808)); - this.list_0.Add(new Class_ECUS("2MB", "SH72531", 16, "0x10", 2097152, 2031616)); - this.list_0.Add(new Class_ECUS("2MB", "SH72531", 17, "0x11", 2097152, 2031616)); - this.list_0.Add(new Class_ECUS("2MB", "SH72531", 14, "0x0E", 2097152, 2031616)); + this.list_0.Add(new Class_ECUS("1MB", "SH7058", 16, "0x10", 1048576, 1015808, "Manual")); + this.list_0.Add(new Class_ECUS("1MB", "SH7058", 17, "0x11", 1048576, 1015808, "Automatic")); + this.list_0.Add(new Class_ECUS("1MB", "SH7058", 14, "0x0E", 1048576, 1015808, "CVT(maybe?)")); + this.list_0.Add(new Class_ECUS("2MB", "SH72531", 16, "0x10", 2097152, 2031616, "Manual")); + this.list_0.Add(new Class_ECUS("2MB", "SH72531", 17, "0x11", 2097152, 2031616, "Automatic")); + this.list_0.Add(new Class_ECUS("2MB", "SH72531", 14, "0x0E", 2097152, 2031616, "CVT(maybe?)")); } @@ -77,14 +78,15 @@ public class GForm_PlatformSelect : DarkForm private void InitializeComponent() { - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); this.darkButton_0 = new DarkUI.Controls.DarkButton(); this.dataGridView_0 = new System.Windows.Forms.DataGridView(); this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.TransmissionType = new System.Windows.Forms.DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView_0)).BeginInit(); this.SuspendLayout(); // @@ -92,7 +94,7 @@ public class GForm_PlatformSelect : DarkForm // this.darkButton_0.Checked = false; this.darkButton_0.DialogResult = System.Windows.Forms.DialogResult.OK; - this.darkButton_0.Location = new System.Drawing.Point(460, 250); + this.darkButton_0.Location = new System.Drawing.Point(460, 196); this.darkButton_0.Name = "darkButton_0"; this.darkButton_0.Size = new System.Drawing.Size(101, 23); this.darkButton_0.TabIndex = 1; @@ -105,82 +107,94 @@ public class GForm_PlatformSelect : DarkForm this.dataGridView_0.AllowUserToDeleteRows = false; this.dataGridView_0.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dataGridView_0.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); - dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridView_0.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); + dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView_0.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; this.dataGridView_0.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView_0.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.Column1, this.Column2, - this.Column3}); - dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); - dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridView_0.DefaultCellStyle = dataGridViewCellStyle2; + this.Column3, + this.TransmissionType}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); + dataGridViewCellStyle5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView_0.DefaultCellStyle = dataGridViewCellStyle5; this.dataGridView_0.EnableHeadersVisualStyles = false; this.dataGridView_0.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); this.dataGridView_0.Location = new System.Drawing.Point(8, 8); this.dataGridView_0.Margin = new System.Windows.Forms.Padding(2); this.dataGridView_0.Name = "dataGridView_0"; this.dataGridView_0.ReadOnly = true; - dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); - dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridView_0.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(63)))), ((int)(((byte)(63)))), ((int)(((byte)(63))))); + dataGridViewCellStyle6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle6.ForeColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridView_0.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; this.dataGridView_0.RowHeadersVisible = false; this.dataGridView_0.RowHeadersWidth = 80; this.dataGridView_0.RowTemplate.Height = 28; this.dataGridView_0.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.dataGridView_0.Size = new System.Drawing.Size(436, 265); + this.dataGridView_0.Size = new System.Drawing.Size(436, 211); this.dataGridView_0.TabIndex = 4; this.dataGridView_0.DoubleClick += new System.EventHandler(this.method_2); // // Column1 // - this.Column1.FillWeight = 83.27443F; + this.Column1.FillWeight = 67.67797F; this.Column1.HeaderText = "Processor Type"; + this.Column1.MinimumWidth = 35; this.Column1.Name = "Column1"; this.Column1.ReadOnly = true; // // Column2 // - this.Column2.FillWeight = 53.29949F; + this.Column2.FillWeight = 71.06599F; this.Column2.HeaderText = "Rom Size"; + this.Column2.MinimumWidth = 35; this.Column2.Name = "Column2"; this.Column2.ReadOnly = true; // // Column3 // - this.Column3.FillWeight = 163.4261F; + this.Column3.FillWeight = 68.42973F; this.Column3.HeaderText = "ECUID"; + this.Column3.MinimumWidth = 35; this.Column3.Name = "Column3"; this.Column3.ReadOnly = true; // - // GForm1 + // TransmissionType + // + this.TransmissionType.FillWeight = 192.8263F; + this.TransmissionType.HeaderText = "Transmission Type"; + this.TransmissionType.MinimumWidth = 35; + this.TransmissionType.Name = "TransmissionType"; + this.TransmissionType.ReadOnly = true; + // + // GForm_PlatformSelect // this.AcceptButton = this.darkButton_0; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(571, 287); + this.ClientSize = new System.Drawing.Size(571, 225); this.ControlBox = false; this.Controls.Add(this.dataGridView_0); this.Controls.Add(this.darkButton_0); this.MaximizeBox = false; this.MinimizeBox = false; - this.Name = "GForm1"; + this.Name = "GForm_PlatformSelect"; this.ShowIcon = false; this.ShowInTaskbar = false; this.Text = "Select Platform"; @@ -213,6 +227,7 @@ public class GForm_PlatformSelect : DarkForm private DataGridViewTextBoxColumn Column1; private DataGridViewTextBoxColumn Column2; private DataGridViewTextBoxColumn Column3; + private DataGridViewTextBoxColumn TransmissionType; private DataGridViewTextBoxColumn dataGridViewTextBoxColumn_2; } diff --git a/GForm_PlatformSelect.resx b/GForm_PlatformSelect.resx index 29dcb1b..3c94017 100644 --- a/GForm_PlatformSelect.resx +++ b/GForm_PlatformSelect.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + \ No newline at end of file diff --git a/bin/Debug/FlashToolTest.exe b/bin/Debug/FlashToolTest.exe index 1604204bd2c4452624d8b0b3d52c978d27fbfb90..7f4bd2586c7450cc0e6925e136c6d5daa1df7efc 100644 GIT binary patch delta 39787 zcmbWg31C#!^*?^!doypgWXPLIW+v-Q0!bzdn1w*XnuGwNfXHS*Dn2gCYq%eeC5Q}jO@`UUQ!R4Sv3q*CXqji%I1(MzP^ z4w8K>xXzD0AO)Q$!cYVASfYQF3QO-G4e)a^er0B5%ljA`*uof5Bc#B8ApTmJgqKC< z$Qja{Xq!CCD!XlAPxN+qi&h}_*r9NFk*xIcL^Q1Io!`osRO}0Gxj`>t%;~jjcK@Dm z7UX#yTODBcX%6460iN`04nLAkK@FHmP_vPA32F`{qj{E*)6Rzsrz-b8j|}Ehd+4bT zM;+l209#)KT0GKUvh@Wdj;UM0-BpZ?;y%g=qg55^F|{Xpg(X~;NzIePUXsW);Yk7p??!B5pSJbnB)91Csq;#fo#HF7X{fX*N51Y=#b$p@iL@M^@4D^xFW8`2RXrce(>}2-x5+={-^H2&jZ ziLteMAyQtK=Bjka;e6_o3Y)0Mxs{ZN90ZdbE}%m7)N`uu3Tk2m9>!Jfyv8T3V%#i5lJ|HMs2h!xA$UO%wX2i-*@@KCR|cHJ>&gIeB)g z*Y5MC*Z-U`)URsxU0yd_pQyam-eEp(Mn#>-(L@fo@K0+E!vLz+!_$y8O!I_8L>b1k z3`oe(GBo!wi`T1pNB&Yv_Z^eGnObJ0q76&a(*3})v@F8Xwe$cmpP~6GE!r@zMN7{H z?$`VrwQA`(Km%HUqpFsk3p88H=BSN9R;w2>@=#TdmNTyY`|rPphG7h2wJ!txpxJZK zoH$8KCaF6+au$hpI1Dtzv9lwI*XtBzH9Po@Nz{T|Ew?g57~dtujIUXDb_6rd)WDT@ zrr^ud@?w0aC-@wF!>D#!pBoRwo3G_p!exTcl$A3hw@PK5=tj6cJk}RRkWl*&EiGFK zkoT#5>4Xx{$HEz)kyEW4X?nxs@rq>s2@A87(k@$NiCKEQA;;Py+SeAx>)*sUN|f^- zlhf?6*8MBaWpcnBo$2+Lql8BZH;~6#*jDNXuQl)T1w1Cn;c=kvFZM?ag{|FR9FW7~ z;eXD^cAybhV68p@43W!I(EY{Pk=>j>$77BB1gY>uE+#i}6OqG{s4@z1labIH0hp#D zx-?OWv}s0S+)DVz+rvD{F(2lYTzv{ZMR)A%P~aP8 zBv6soTPVxtsz_t1O|k77U^aiN%Z8j|mNfgwPgFCMAeLBpAVP@J(CdqwDwpE&rB%3@ z%`PkURus1Tjn*`~dd!mU82O3KYpGxwg)xd^B~St$03{S2rk!edD(ViyP!(YWsR}cC z+tMnSotLq)c9emeP~?MY5%eN=r5H1EPYQ~lm}}_Mz{&a4+-#1B=%c{R(BYXjkyntD zlxIt{QekJIQh2u3MWKY|yd&s#n)B$HH0Qkpl+SrbkvOIzy3?Ge(WFONu}QBFlU}}Y z9fYDkG!|lLu;_rU>Clu6xB%_LG^+Y`r7LE_Yq7*qR=3q{vDzJBSdbinKdk%_`W|AJ zdR5h~sV@!K0CX%U(A9{2X?9)};)zYO86$77=`)ZeXc7g@N-I_c71m4urqOi4yXieV z;X*KZIMOMh4HqOpj9I5ET5UvdKaSqZv@Ayz?qYQWA89-Ex-DW__e?R)lfN04_K7|s}ypQ*|om#V0iJ^NLQ zZNF*`P+BMKhY-y78sm|RBzRQ_i15y&>Dy_F5|ZBcxv)m6$YF|R*`p?UP4>Gm)!$#8%bissm}A1l&UuLB50A52@$ksoMwAnJb2 zo*^;Ci(b=QyxXkoCs5eSTkZ65X|8NDFsr^jh{~!TFrWtZ>`$}XjBpioJXUvM3^PX< zOD7d%K~?>O2n>3pJ7~7FP&-CGr}_eB5ublh**GE2VoJ4nt^UQ7LL$Yyr0wfz6j$4HZC*HGyj5XZ2 zlR>t55k9r_az;~srj;>lIAVUpWG@^g&8R5RTw0obDjdn1&Qwo&cqWpOqclRfcQGvu zRYIiZ;xV@7MKOQB3J$S25`aw3?= z@yw0n^JiY9lt1$$)$~m7nnem)d|r3ORJN7YH=29UTGl&EvqZ*&TN@UciU(I;b6&+Etp62ym-U@Y- zc8d8vZvoTty+NNhRR2>rp%&Cad%T5AD~$72n!Cy(t;n}0vIuP#n}^}r@XC#hh;i0& zg4MsrJ3=e+@9`V4`Vtw%S^>p`60M{XtsH?>b+I>xX$7>VF4al}F$=_85NT;0*2045 z12K;{TcI=4LU@L>kQUt8F?l-oQk%ET=Pj?##HvCo)5`aFD-5Pp#FdNfjw^YaE4?TA zyjAtI0n<*>s`hxRnN}U=jkUQ(t3jLF;%%DCaTPUtWF>5# zcR34)>skN{X)PBcTFb_8*7Ej;5lmxaufk)>r1(NIY5ol_q(;L4mYJj;^YQ(luMbncrJR=KACmz5$i7~f$sz}vdj0hD_Xg&?Zk*dlkG z38i{5VvwXT*Bhi{>=WHeR0M4_AkNG^PHKl>NpK_!H_Iav z&7jpXv|-uQh^}+F33NQ1h;G<}H!)Q|4@9nUA3DmyadH9!v%STyuLdu$smTaT8_TKC zggqkfQk)e%gGB}Qfr#Yjee|>G;yuvI;)}_HHzyFRvJ%L26A7T+t)x+S4ODPKNj~26 z&S<~WYv`b*G1*QbL}kA8Y#tJekF28t*n?n2AltF?g5Egn)2v$yDFd=Gb8BjrI4hwY z#sU`15aHCJSqpI18q5f<6>V;!A`s}*9C`!~(L6a)W@X0OCW`nZe~g=(!>({M#yoIY3|IWnF&C^+(A z66RV4(y?g997pGRqp&|*Is}g#xenCG2$ik%1*^hckWj)Znj8jZcUlVI_^UF2vW;Mf zJa13o%7fcbH^+U5y4ge!Jze%n9D#}$3(Qt&v&FGYubau5Tkj@~*Yir>rXp&kP324m zd$WRvlqQTzcpAfqU=L%(Gy;eVY5E~L+=IOZdQB3Y@=nI@H=s9y4!u|vdW-nsAuI!l zGm`k9Mnh&mcSYX-Re+pA!8!6zGioG*H8+JeS6dMc)Le z>!G~llzUD^-Kyz)7JV~v!o~!0`*IrMR1oomVW?10g$zsPF$E!Y7?TA`=TMjsc{H%H zYru;`V?=}VAqhvpdJmo$T|sE4Z{caVrx{{+WYT*%Mc;}Cyak<(u2KwEu|U-g&=hgX zB}ZnUc%%ow7i<)cBLDv#@=${-sj%mvBpRiO2*7t2s2Po#CW4sZvc;kp=s3{uqvoo%OJ!yD7D!a&#xZpgWni*$ z>K7zs98)I~{X(K&l%VSuQyPuqQ`2+*rFH+kaR%dOGbe1FUo0p7-x~Knv~Bzljiadl zSB0@4cSI5OlLPn<#BWJvIo*-9Hj9$j*UHBn@$;c(76=O zHaMsy3YXH#s0pQe{ODG%)q$(10XcFjFGQZ36bchH#Oq!uiqmXC1;y2pm+mh7*o1RE zu*Yur8@dvEY)$or5h7FyroLk`#l;4!Gbjru^iHg_hiStq(@pKXHpB0=Gi+Jw4{#>? zNUP?~ISJPsl}^naIA(!UV+&9r`ROvFvJ;D0P`ubo;syq_xwW*`KpzNBUb|8gO8j#?6AumrAz>*ETyla$CbzoJ+%A{KCYf24Ylyp60`? zq~d?G$D^MvBD))B401rf*az^48J{p|DHNM9D^5k(XUR;KA54<& zNkdDHjD?jP`W4h;LyayaJMwL>LzTF0V(*R8a6r->7akrKX`_K4#zy_m$lP65ld-5b zv0j1`$ab+Jpks5jmlj#b+D%z_UW@1I@O4zeD%gCual{;h^N+}-!n9&3wzI>ldQ`q< zBun4J^RhkG@E$6h$jXU)$g^^hb$v<}ziiY8Kx1f8mY6YzTuwJ9ucvKTPuotsp5|kj z#TL_}V1SRv=c4cCduKRd=@Iyi4QnzF{D~EVR)gQ<<#QV76G5Ai#7~>?ZqSRO6AO$V z4W~ZCtw&&S*9~X{OiR~kVVivy&X^+~qt*J2pqHqTzaj0ojJ8oaLMoybzs= z{H>jf7RQrkhHnBF7BoE1-b3PhND-0TLJBH$%&xM?_h^13m_|0hc1@g9^Cb)IYFl%7?FES#aIvqDfYU0 ziC1%Z9hg?J6<&rWAW$XO>l5D1)iTV+^azE*H-nwMg%vcelZCzQ$5cetWP888f^S;* zRQ@N!l2;tq^9?)%JMJlKYT20@&=%^#32_uz!z;yd@4f-TP(jCXn(;y^X1;ajL9 z6~VH|Yr!q=YFzXm0QJn?H>t4FOQmIdFR{x#jeu}8%nd0Td1NlOw;ItRR;FB>l-&oD zAyjM3D%|(IiJh;{*76k6>#;I=FhYb_kJSm*dm%3A7e>@{i7 zKZV2(ZQ@e4ImQV#aoAyT zB(E8>*_(sUbIe6!w6x?$Mj6>on8PU?8%L@wWM--({4;pc-W%k!rV+qxA3P9pCA;l3-;D;>` zbE54w-cibzrv!qVOU;tU`y~WF&hY7akjPdht_!hb4P{`A>-P{9aa!LM z-B+4fz}Ja%mx#TXLv!x&y6A->7hfgn^P(@8jy$OW6-MeXJ!t8PdrUB;>xUp~(CSOS zFM3kAGzg>Ol_U0cI&6kf8$WJyIVx=qeM)qFxJRmpei0t;py4|f8WT3ru&|kEeI*&O z>wd_f)1rB(+B_}t>kp9N_(@XitjJ|+aG)Gcm&qm5?EF>8z7bH|yyw_T=@9!r#&)I4 z90|__yVrsZwwSso=rkHEaw%%#J{P&4Qez-5@+nd|IIVpU2yN5z;0-j@Ww3-?&GHha zi-;>7bLkp@obW^7CQds0?PT(Qiy#Z3k1U&OdqVGM4RI>zY|}4{J=IQ2f}EJkaVyn_XMCYZP+ke8t6zoakxQe zZGi!=4M!R_aioC}LZ@wXJwRs#8EzVaWQ(MOv-mFk+?XYXkPy2hn7}0r5|C#uYSzaD zz|wBg5-*SE@D$EzigS4ir!&S7^08Is8ZI76ehyxv&wxCybE`%VSI{MD^aV!`;8NOw zHfuIKbI#EmXTLO{IXA2x4#Ut-qvj}BygGasDj&0w*@kJxu*$s1HK@qrjJ!nkVHS4s zo8+#aBXvH#v|NUbF~WAnBLAX-#lhfGa~X!?J6pDv(W+^PN%0qz9oVqrWNzfMn(GHD z#?Bt~zUIcolgD*}iZd%J=|sVyWe%=5iz;@sYMHHC7S)}JvjQ9vXjHdP^Nsw?ah*=@ zKvSo?hnaCV*5^35gJA~mj_o|+iZM!I8t(&`yW@n*(R&cUuZCuP?R{~sKCl6TEhG3dJR z8;jyJ#B%Vv614s#I!JsEy$!T0@H==9y$7@dN&Ma_8^fN7RgI?bfPG$w;f?N-uoC3SPKddSTI`O7(j{e`+Z7G!YcA$AZPVZp(nvVpa3ps#pgmo#s(QhW+r`beefH>x=JyHXsb3 zXnI8lQ*y;h%$fzAto$IaAhCzW!WTrbIODHDo<#fMJ#@6^B$l)AdULr`+`z9=*uJ3p0;Xl9tJG*AtYiPb5hJ zK{a}@mW*-K@#L?Fd0c{;l}MuA81Jk^a%Lh47l|=U=gB8Y*t7(7YJxhRl13Njn2;dD zD0JB7~lUdxWt6 zWnIr1#Qc0B&#%9bK!T(77ZaFIKOzw7)6g3z9$cJK8PWav(F9Y(laZ*ImwFxwhW3({ z(19uzYfH)tj@4gEDmsdaE)@jw9H0Jj0?7+{Q)(uL$o!=RP@Jc;>{;|@T6Ep zzzj>Ilgho45RPLA=%aSM3X=XiK_`ceYakG;J;|Vidh5ugq_JXIYUGjVkUVyZ((UI?nE`T>z6uOw+i1k%VDY$3`BR>w5rOhZcBoI?0Lh?d%3zK3aB1iHxBjF%K8OlgR57xvq;^oF9X+#8{{(I3I zgg`xvq*V22$OLQYU-&iZ*4G95II_PESH{^&Hdu5VJH|(tAZHCt&K#OdQE3PvGlwQ4 zTH&<%_&OfWlE|oEw39kEi5?@92PTt)u0eyIEE{R1{xBm9 z5k!PZ9_Mkh2J2%zNsK;2e=}k7$Oe*Q4tg?t+@lD|3#}OJL`05Ul~g$qhVmhz2gk>1 z=Ed&hK1A^kqnIf0o3_DzL){!#LLjDF6OtFYe(*pea^!bO8WCYAjffr`ryFL>QV zm4rq_fJT^0QazbGEUuA2OpOT13q3SgBO*s|#}@A(BE&UHj{lSqY={|&mzz)JUJ)7* z0UBYVOVx;+JFbyHOpOT13vNvr_e6_qi>qVEJw%D?gQ{ZF5z!Og!prSRQiljo2eWvp zICe}r~*mp@95dj*_8?4bZ(Ea*bLJ2}b7N)ZVuI-@Q!LSgbukrru`yK49M%-A;>MXu@i+cXDrMz` z=;|`1W+F#cC)G@Z&|_3{>f}!JU~Q~sUhG0DX8JD?;u8fSu+$v*f2#YypAx1bByOr9 zEJgVRXn*pOi)fMClhh?baMBgkbj|6LI2% zn2C6qD>HHA6H|;Ram6MBiR(p3XU6CHSTH+f&=Ea2F{U{$Cub!r+L){>Au(MWQ+1`R<8(EsF>i~;aE9M8C@af@ zhA9_YLzS8f0V4QxO|Y7oY<5s zEACIURSZp$A-E|;a0}HRxiLvHaULg`6Psg_35!dnooDczP&Qi5-MlTxJ1AtJAcp|Tg2F7jR13+ zx;{h&;XiRb{oz0JXXpWRPG~#;w^H~cv>#JsSZq_sSmu7jq)?}%QpjmiDdfMY6dE9@ z6dIbTlx9KUOEj}GiZZE86wy*ClaHg&yphU7Q(P*ACgfBKtqF)iOH{LZ+A^gwH5^A7 zouH_ZxzrmU!+_ma;M6w!iLmg~WZ{W13+tb9YGf67!@S4kNb>26!6kminfTe0Pyb5- z(f`WRzObN$IVz3`pJ(ESe-w^?xQSn+_2omu*t;|R%F<1I78JPZCW*{U8QX z7;T&}JB6kZP5%mVVl{t_v`zm9U zUNMF&@foO*uK*G{g`g8YeQ^Sv5(VNq#R?3qQ>=ioHW*hbR^pXZo$$Jsg@4R2PdFX# z_S@BKL~=1Dh3o&Cl$K*>uUsRBRq30_MS$uxZMvGBwMmD?$l@SQ1DuL$?x!`Iqv7 z6M~b2O=6?25?uv@O(Z5GYqH3~d+qdkkhvGJH2Jc9U3d$~spG8-WQ6hMRZcxkq|+(w z7HO;koH}+E{5>MPy%8J5c#Fl8zyi8Af#{h?=UjdR-3Q_gRO%TXJ*Z!J#Gqcmi|ld_ z^~ruci;CJ}TH8qH6s>JTYmNEOmZY{VoKV{qPN;1Q=t*kZbYDVIpYBf}!8!C#7%Pw< z7ZjxQJ6Sx?m5qGe$VqTTR#Uf%Ns{-9U(cmnd#qLV<631Ox>YEX)F^vWqwGnIvio(- zNK|jv^Ad~J}Pyz|vN6!8-Is0=MBe4@VYIIJ_iwWUQ zi})|RwonM5el7~0c~P@olpsVdA;Sz$5Q4*XytGd05r5=1%ElY(F@j$&5ePX;(KCfR zL5-I-ew;&}dVlf)4rE{T-}GjY;u^%Q&wuT+W}72~f*i-}%B7W*+WkATP3lR9?#K5TR2n_xP#~ zx5~GXt$xmY^=aUg3#tG^?~x^&=s&8*3^lyqZrUVLo^8xn1U;2R0`uV&)&~ z*GF+BcG z)_VLTbrwpbOj1M`Vv;j<&*sS*sMSjiiO(`Z9}F$>bVA~@3?U)R zVQkRx9nn)}7$O8ujn6PfLRNfm@-oR&3=uF|*9@LwNX_`9M@S$x=@Al48>9;nBQH@G zm@y6nBUu@t3$f+K0tGMg8I^e@kqce)!Mc#00(xztZ~gk{1Oi>sQbI7XNB)&f=WnJm zMB$$h3udLnEu!a{>im~+)hfaMGtHePS9j2uB3Y?p%Af|OlE~U7B|BWl+i=`)3*^Ly zTTXZk=ZTbnW)3qLs554u@K{p>-$UV>HNy2o@P+YGDki@!Y%|pGxacoV3m6TwX4-lV z>c=NXFdB+jWIlu*f%l6SG4$~$(=`FWW$Pn8!EJs+Al7UWe>rL#mxEQFg>PH%^&fqN zU?C~;vH3(j%j5ZScp~XCseEDACemgSux=MB?IRw90s5#Z0>wg^f6uKF;9nJpw}U5x zv3yilFADX&5ZyH=t2CJxZxmRLG$#KO3Zp$ z`6U=`ug16|d&u~hc*MJsCNmSC>zIKj|4AD3O!!rhdwOi&N5xNY+cMH4M#Sr{EV!I38p0B8G)Nf7LF4 zCpMV;gQt{_JtXJR%rxGG#o~s3@ZrK-OR>tH;IJX*vJu1By--?ZSLb*NRaS50(j%M0 zgB-5sa3_a%a;E;A5Am%TZ)FpFhf{u?Q=G4|uR?z;#aBh=5R`LXu2k9Q;YWiidm%{h ziEOHPUiM`uH47E1>=FynpH{B)sO*NIbC{D|7BsF8scbipm2Bk*`sT~0f*qx9_F`dk zsfWFlzX76mS+4XrnKJzA0+qP}j|QFWe55_>Hx(PeSytH$n8)F#1(a?nBKT!RGs^y} zj;>SL|x1YgV~7z{paRoPR8j~Wp7%aX4Poa{9~4|@SsI@wo9``9TyVqF=2 z7@sq@6i^HP#ani1(I3k_Y;$k}RQ$SVL#dDL8BUyEZv@ zTUp>IQ(sa^Hh2cM!K;MjWW`39+Q$xav%d`sp%e4TerNDz8z;kn9`-KG?qQ#Cw*GST7F-C0lUx0yD#6vHe?a&0vND>HIKM2|5G--kiL*IRJozFfK_wW z3)6_RmG`-uvKM~iVTVvwW#?9U3Z3i??h|L1 zQ@ekU7E>Ikw-c0jG|6Be1Dho<199nTgeF2|{ARF^iU@Ncxb)#`!k)owI1AsLo5zbf zLyT=kP95jWC?o7Nb`Hmmg$Y~2&gJFGxs-G0+vFj$qWF#CS>Qupgv@p8wFR(2<58G;BN3i@%*nC9RS?pDI3CEu1 z*z4?aj^%N+|G=(f*vGR9#OA5eTkOXi(;+2+{XPZT2`M5^Vy9&qbD+dy-Y0ObFe;PM zI)~qQp919#4zn^TeWQ1dqOpG~hpifWz(R1ZmEeI2qE9OMjl;)&6(-8b-oqFni_4FI z@_OD8hsM@OFGIrLJiiCLMt%eEfQ8`m%G(AWEQ_l5`zZTLD`kiR&*i-j5!0nPijTP! zQf{;SC*`$eClPU^9+Hpy2j${QqCfNb2<#fPnBvQ1@O;G2pS;JL7 zPxc^piR=eFL&^i3tq`1UA=qXmXjci|OweGrD^y^Mh2Z&Cf~6|KOqE2}*@*RSo^G-c z_LQSm+F>X7Z~Kox$!C;qH+aUMoP-Q>5vy#a^pDaAeyO&BGRZ;kY+ktDMf7PZ z!PhNR!DF00jo~}F)eg@Sj)i^irnfs6_LXS_FUlbJ9jC11luAyy%1!hq(+qlS;2E!Q zriX?RWjAN~Sfn}Z=I{uIKjpbUZ5 z(D(GT4v-o-%ma+IV^rE2&=rl~Vkg119Da~N>DPGfau20FoTrV`XYlkpZldpZ5&W}* z;Ax!mR-Vr1awY;A3;V9%B*w+Ha1odB^s;m+wu%dC#JSF?vKtYO#;}q0^-do<#5N~U`a#*mDLQ-Eq4Kz*GJN|TArwsT?Y;65r2imY zfMO#3DZ2z|!BZ&hbk4y9#Mp%a1B)??a*k~WwhJTUA(3ZanSVgCv&T&A{QM031&U`( z?48^Jr-L0evA^W*HGsZhqLWe3$=)-uc_@fQn2DV{;(+90Uz*s$5g7a4|~kSZkO+HdRfbGk@vcMuQQ8% zhjlh_PPabf^cyUM?Es;F1)9xTI3^67%jR%wSKxvX6O~-{6O;34&!f&=oHw_&1R+8=U`XP23n$Ni9VBD>kdex^O-oXmb; z6MMzPdW*hxPGNyjqQWODk2$BY-*D_2c2&8}bu#NdiSn*t52o8(GuV71uznW6vgA}|AItODui%z5*$5LmCTC!QvWjEbnF=k&PEny#+*bS)SN9?hQqTD)QOWC!PM1>b?RjxMn zPP4$ueD$tn%rcdq2wuo?+*Pi2_S`heyoULuX4gtKbGpF(BcI~xV7GB>7aM7r<2sjx zP8MP$w#c=H4V*$)KRYBZcj>I^RFP-3bhy^C&pFo59)o4N*^@H`=k2h}2DW@QFs%Pr zow~@iiM>WB#5}16T<5bRa|pYTy&PQc+QKqV7ub8idRZ&S`q`PbfNLvz4i|G&?q_Ik zAIro+GGVS@k82xy$i!-tD%W=QW-H}g$gb12xh`Ov77=D#hz~UNxGrWRaJ)^Kw_A6* zcCgGd3F~LiqbsgpC!5%C+;i+=ttRGW0aui@E+Nh*rOfOstdpss~_N4ML*V%NL&us2LhlJ)|7pJO5>T+i&Zq=%S* zgsVsPnu#5g2}|o1dE|)Kvp$Xq)ox%9nR%qzjcn=p#0i-c$!}z91!})ZI^epIZ8EWY zq&tE2bBrnsxPHQJHnC%Jz_pKAdlD7i!~z@>72d+;n0Zv;0rqq+aqeOnp^3@?_AbXT zb5QjM*k>G#+8-`D_Dc^ng#xs`Qu zOqlytc1cQJlw;f3hw`&1cQDRrOjK@T_b0L5#vV0Uf5DEpZevd;#?O$u=${KuS#sFtPH1EIMtesw2k2c4V<35{{hm6_F}A;lu-Isjo^(H1TO?d zHYxOd?lKlCL>FoN#hgLu#hjAmC;C4D!H)?|q_LO4lqItPUW-WY%0$~0c1b2N-G@0_ zX1jP=31wu+jONCeDs;dnvxfl{b_;A^VgE#BR(3BaDjNVrViC;jGJ6k-Dy$rIiKp=n z&56^-|HAYGJXb(PnSES9Rki|3>>^I7=UqU#5);tHE#1l$O+eg8UB}z~CeJ=mIty)* zn1CnZNv03uEl#GKAZ@VHAhqBu-YdyWBtmAt<${E`7$qY^F;!V6Q8!)5d)=Sn4KnOO z{P+`S++&g@C#Q{M5y=_k+YPtB#uWNf=h#R(qD71awmKDq+6UgBzvM%s$= zFKb4I$|kFW1tqJJoW4DuIB`#dYFxZil5@q7OQs0^3}6{5l?Rhti)jz(Rax&;DeC6ErlICN=ULBuq^Yul^6jw7K{-9_RUU^b2c*%Q=b-#nxIh`rIrBJWG*lm< zUxA{Aj(|L=(W#4(SSd+3K{a&R*dM@*@vQEkiKBjyjUr>2OG1e)kroW}E zQ?AK>U!k7+Sm~F>`Je>S|5ExD3A@5FnD>CRL%J&4ZrLHN^1%W zVBkKa|5R`o@Y6zq>w|}_o2A=^KVtnDJWnG1ZQgTMP07oChoF)DAxJM2d(`XXapl=+ z9=kbMu70ch2Oc1Cp*xg*yx~DM2ulP{Rwc`nifhz<;*tCj6i5 z0glT02jEqu|FOMmF?@=>P_E*1wS+2u4*Xw0z62W>Ss@p)$-IT~O3w5+`l(QEz&mKw za&ei2^mSPt`%&px^y0^ssIkc#7R&Sy6eWy$xmC?EPFqlXZ!=+djkkuiRcc1>^1Z z)2$R0WVVmJVz;wOL9()sq#Ny4_L;O7@N;QD;8)VkfZs?5 z0Kb!N17z~;fEM{qK)d`?z%==8zzq3bz)bl*z<~S!V4nOCB2QhpEc zDkx!P*UBFN4)E&t^6GEq)!!!n3G_SVj{xtMKLNZ?{tWOT`LBS#kUs}}O#VCIlU$+S z$X_A-ocs^KBQja>6`8E~8d(v4eS(|u9d5=Cf&*bj_KbMaIeuckNh%S(2 z!0%*u57vXp^#MqiW})XB?B;|cmPKzWRI|tiFBnx)~Zr`jzVT! z%Kn~K$fE3@X{BsC(xY&&It&n}8-TfNEZ}g~2w1`90oHOjp2I1eekxl8`aDiKlfz|f z9Vq9q>jAsiZD~!6YH8xNoXyj1CX5=WxQ`?KCL~q%^7K9v66G<8#$aJ-GsL{rbu^yX9}mB4QTv5Z5cTNxQxT?9R7;K_c>G)Dm9$LcO6I@Y418n(?Ta@^t%Kk%08ZM zOe4zK0;W^CkHbdy^+?;X^(?~e7WOLmZYT*G3i_)b5~%blJGL))=A+BbW&4?3%9W-| zr%D^72XNJ_$+>c=JX$u!%Zud|@>;oH-YMTK&r=pDtCfqDs}zeR&5~j9TWT%aEx)&X zZ*f_RtyR`@truCN)>o{5u~w<|>OA#F>bdHGdO$s-zM#IRF1M|>ZMQvaJKf%4*X;^d zz=6|$C;qwcFCFS^&HuBDu`hBz1w14F&lB-jJc39adH9xQb~1+-aM&3jx>foT@P6qV zz}Je70scB*Nn`BVGG|)!z}kiQN<$4bc>rZxaeI+o1}MY-vXEX4DC0|`@mD?AdhA0a zwgFJa<##T72ww&DwDdb^wj98+a=Nm`b_9Qzy`8-VxPrX{xRQMYxQcxa*ulO5JeM*2 z0pIhO9dI?v*p0tmvW5kKbg~ej&cc9eSryAQZZ-#SJ!=Krz|IET z$Si%dT}uAx#I7BC#Q4u8_U+g#4yK703uHP$P8454CLUCHLn+Y`JcJcs&p(*&dK?*~ z(xUeJu-z0tRKBj5u}x7SD~fd0RY;?Lwh_ojgdlwi(&;cTzIF*$CNkbWkkK_3bdUwz zg6RRjS@2N2R)S7Z@i(z(d#J*H)6gaKrb8NhHVyAMwBoZstvFtP8?PBCl3!|N?NYJ2 z8BhMRroDTWzI&=_H+nXYhw#}2yS-MnYOt)4 z>Z-1bR(3t&o<2>FtXVp%t)mm=mq+(q88{?&hotD_^(RRSqgSsVuPtwjoY%a*yIb$9 zSvqBP$FlRH&#$jYE>|teMYRpH-1^$~&S@R1+gm!?R_iOHOE%<<*4I|EQ`&V*rZ$Xem@<0WG#I?5s(ETdb=}mKF=OkZh3j*p?{1n+ zGRwxWma4j@8dN{69+i%sGPQneZOhoI(PO7o)mPUwH;qNFG&DC%jYc*fiq1a&%jmg1 zwd$0%)yw8Bh+f|_HQZ8PS5rT&c5G8qLv8)&+M1f`(M|QuW5?D_t*aVaS6f?ERW+@p zWo%3Ik3EIFTvN-TV?Ei@q?Q>?(`TPHZ~lxaOQ)PRYgW_j7Di%Y&snDdr!HPP_ly=c zQ*T>N&zAOOkbVI;Cdx z)VjKshT4|e==r_#U31&pmWz&QKJ;8~k?dL<>73IZS+l;oX=d~@V-DAC)`COh`p%Zq zNRigl=5mD&?cP=)*@)6IV`231?O&_Y+q;2A@B6>q8B14mMAmF4>y1>((Qi zXSc0sXDgO=M$g=lV^GEIGdntk{Mqdrd77lmTEDuxV>RV8uV1mEJ<`6sMF%ovHNk~# ztJk+vlet=h?I5%mWE=)PyW1nY5Eba$jAZn-9qXL2K~}ponte&0bxNeYt@}{zC2z{M zuJ*RbvQTp&$|`8qzM4_jo5^L-Uth7P zh^&lw)!w#-O<&xx)=bW7UjvH@BpSSOauF}rzU;iN^=lY9SYIDm);_DPlg;l~(>`x4 z5-XzXuIw2JHWEl(aYhG1==$!do4VUO$&uK+&0XE?YevmDZItOHhyHx!sggQHU%Pp} z9wJBtzA^fT z==A~AIkj{Bn)XN=ynvDCoVJ#bLtR%rA(h4bds$oO@{Z+g-R)h%LL!=_&>-{5qO*ZJT8&!snsQ*UmRN)<+`IXRgbyn6`fP zYIA5as7ym#j1<;In zrem}84ehhrH$_M9Ss~4d?%s1&7HPH?GMA#w=d?$bV!W;Bh<>?et9lNfYocqf-%&DU z75WNMynQ9c!RDCh=d~|e&+(~i)`H5S?txnj>q@*=$A-6HZL$mtip^MHbYnfziS)RcM zR2|Y+bEz>qlSxH`+fdgsU~9436ej9MO7sKjr)E>(Zr*q*M9LHEiJBMUwvII|wZw8R zxD5yLtZ(}oQ!v#{ek6=9DiYmfkfAs8nv*pV1`?8E5~&enfo{}5IkEbGSXZVj!Aqc{ zVE&CT52fbf1^gD=C60m%Z^9B&!J-f3bGSgJjAW9s6x6fui<={53w|r`i zK^1gP);uUqeZLH*5~_@YoE1=P979<%1qo&fa?BK@nW>S?kjx~+n<-Rcrcjk*11eb! zk<42OD{Y3KkArjeKzCeh+e9w2QnhSW7=Q913}r%QK0T|!SH>wdND-wrP8rScCk2UA zXOc>Q!61BWdu5G!FJ6wI_)5SwR7lMhfoc}06n8>6c4*J6fZEykmIulUwg9D4d4c zs6SSLfpj7_4#%84D&3xa=&{>^is2x~=ac=$WXBoW5tH36*&)U7Io|z#n4f%Z5`u5T zX{HfEDZYE6!U?Zu!bG)r89%wT$2&c>n|pY)`p!8s(`Ugjv^by;${gf7)%0EB-X`90 zWGWit9q0~`TLu4Q{wZuB95&2zH}k1(GAlb2y)#WRhR^5DPb-61q!0^?5K7S63GPyO zBAz%$*>sEriVSNoMCS1B>&B8sP-xguq@wu3g2`Bj9s0#xJ;Chjhq=$v`-)hjQ2 zpy#VMYNPhMYovzg_`7p*PL~Q;mZzT{ic_+tXGju0kwTQHe)nW|OTJYJF*`nV%Speu zJ7ABMh`xDu9w8Ft{P>>HM&Gw?x7NQ#>tE-G7;Z?!8n$>FqFJRP1j zo^|v)RCsrL9K=DCt(SJng(LMl>%|MHVW`GM{($VIUX`F zYPoE;Sx~2(Z?%!0{hRF$n-v-m#cER=4jf@aFusr8Vz}Kh+9bQ}cGV_(X69QxHfO$- zYPQ;~R?;73I7&_RGMCLEgUEj%HQ()qRCk6g&5ggxX9qc-6VhyIK2#G(mQ5sq!4Syj zY@N0#ZnuFPlFk8|or>DscE#={kz^n71BCE==c_tO-73WP9d-{3S-__C-=+26qxIh}r{Nrzx{`iz`M^B=hoLz%%V1W>_VhoJ z-3kAt7pXra}I4S(I?Pa5=y;fkUfw7si6Hnq3aroN?tneP4KtzArH306cwP zqb;7k>+sj>`oB<60;WK_z7RJ4+HONn5tk{=;eax5Lx&rGP11o7_U#DUFzVU3co98d zMwzTeCPxz?lnm=a#Dr@jUcPXj&lqNNc>4M&20-y|Wf`AUrQV~sh#}6iWEoCQ3JX;$ zY`O7z%szlRunyEB&!DhJDe4#uw)FILhYcZ!%nU)cxH;q;TYA2MDqcl#2!fBqm6d7e z&N7ss(!kVh8?`1&x($6G?@B$q7sMBVolBR9Y#Q=-@QI>d%co%D*)|m-D3c>IfOxjevhy(r0WKK0KVSS8)h-Z^MQI@`)YG>8 zNZZ!N9dKKr$myU5N(gKX7rRb4%C_}_xLG`U(E`bAVLzpXLYGtS3~k#k!F9EGTu0$e zhHFFiEe;A8{nhx-#os{w==N;8ft#U@qG2WPj(whO`wso*fm0>JW=>qP>QGcqKvwYw zMm)V1l^jX6Igl$ts>=D?$V{Wm9q|0V%VpI`$Swj`6TpD*^xZ&UAAws4928aXa{U@8 z{aHl5hf;+L2v!rQgXl^{)z;#-8^5dZy9&Rf@mr7I3HWUU&&edN4bF-591`>wB$mi( zx-*0T>b7EFxTDJ9BE0G%Ng191JX*qZ$GFQQsNln{6y*?=X->kICSe`Ge=xB-+ztmZ z&?JR>dCX<>4}$37U|5IH98cj$%JcNyWj>!WpU;@jqmB?NGcX}wPRIPt#~MxkRJoW+ z;E)ta9w9@bQ=P7mMRGVYI1Lj8n5c8X;0h`9po|@9AyuU9P#+5mPa0Syf(+&q1@7UK zO*LQzOe(yh&cc|d67^V7N|NnP+>!UgE&9{*c%gnN`q#rg&pl9&9EV_?1+emv@8{P@ z+Ydf`(ZPqM2M<0hzj&?hw#G@1&~=oI-;I>O9UrIKGWa8VlUlE)Cqzi}9Q6f% z?9N@NJhRgvl*-18S@rR>1_ VwYYC(&y9Id`&{{(w5!VY{{fFL`al2x delta 30914 zcmcJ231C#!)&G5O-n>~d8S-Y5nJhDz3CSb_36O*U35#S`1Qld4ASe-{hHYR13dZmf z6zc*gK1Ib?1?qy;Dxy-i3N9!L7OdK8T~S-9)=yenORMnzo%`NwA^7?IzyCit=bdxz zx#ymH?so3IZ^rHiGP*w-aMQJCZhda=i_G}@n2AD~P|ny46Jwio=4BnggTTA-WVJdj zGA4ndKUseuY2%wiorRD-hd7YF{kDw-ZbwjJ4$#Y^CRTmhvQ?%sZKhCSFPmm)ouOSX z6xvAl?T~8Go)iLhWML?QePhx-5(-MrBMb0%20kJ)GwV{ue$mbtai_q5hu&rE)!Ri< zK1iD^W(cQit>RhQE^#H4Xtkz$gsIvmrp)nf$hvK-t+3sr*gPA1IqFqxUZ6Ien{A-r z<^Z+p++0GnDrrdbOz5!7V%KhRfJg46XQYrZd$(2K z^7~-sE;qARLDQe;=}H4r4Aga{)3aj;>fDvV(V>LGkCGVEwK|KbOoG0E+S`?#Na@NU zeDyHO;3G7Q&W^&w@M*j?I^j=AvQ4@<&}CvHpbPF*m?;d@ z&N|R^=%cFG^&%=Go4Q_#*9m=Z9%&y*6&eLlJQ$hD%}?Tq#!y(enw#R;oTiuLutaLW zNjO3;B)W~UrIyI(c+wccc=?vdSi;q~>vXo&%H5Hyj`HXgF%nPGIc6P6$cfNUcu5D+!_` zL6j=GKcc%(al`v851xAilNEXl!IY` zQPFjJa<;kgXcHXeCVIlgW~;@dXPb|YA7>i7XTK52DKm<#oJ$x?a zKfBwlxNANqD;fAxNg&hX&Z^!^j7%kKv)hAW??s7<=hQVf(pF==lEQ=GYPVPMX6dG9 zE7@hsSs;V=5OQ{0+0W~9x6@bPUCO0WO9k`McnSqBfl}2}<;ADQ^CKRJjkwju1 z;oi)4JM!E#;Ih0e?kpus$=uLBe%Ofg!khiVq%WO7XzJ>J0S%oi=9|$up*#I zP_`7o@@o$VX{H%$hYKiQKJukgKCv?wvYE$CSg;2$Q76NQ@(>BbTeO;Pf~<-u9V^j= z&}5grk-4N(N z8ukeKSP~z}a>oMVFHGSV5`Pi#7bp0UC4{4HXaW=4kMjT5wY%YzwL|5+Mj(2Mx~cy^ zDn|jw4_3x9ct_L&j^x-ODRfZ(7qP?ti_k&kv4hWu9nju-aB|AnAts55$dI&%ofvSE z+nN+Y^fnv=8?t7%GF(vm{~!+q#Z7{wY2>bt7xL&4K0O)nS=o4!aX9=EG> zCSncOX1CiIJ)YQ48#onH5VAM<~vl3BBdLb$j$vpjB3^*vxAhVX25V|LR+A#ak6eaukwG{wQU+_D?t zkLS3ExF@G3OuCKq4ebH@aaE!)qb!~2w!724ZYN^S-0FXFBb-CbN^b5jMRAtdmE3F| zo0bZmQo-x?DZU!ok1@qb;UQM|vb>mTC0EIA$!^(*NH0CSjJhSvPLtui^gf+dHG)sW z{mC*3&+8@REBR%oL(c^0aSe#B#UmW0&e5m(vDQ6FE}@W>7Aom5(i>4}AjQn>RdUh6 zauJ&aszr)aVybxO?bqY6zVAUskK$3X5adihj;y?M-as~T^Qi1tFHZMt^c*+25q;Hc zRS^`!-vxRV2PuQfvJma*XC=yjFm^(+yMUE?z)V_+!-!LeuM~tkpx8YyX6R1x@j%_j ziRy|`!II#oxJ#AeN(y6h8$ugnZYxrXV%wr3%xT`1H+z*LcStvOurj#J=?W>K4efa? zVKWYm&=uUJN@d1LgCTa(>5jpyR4QpW z4p)ZP+(Ypvn!mal&Sod|N}=%E+yu9D`7EU89bB5CrO( zw}$d~f883sJgLK0kiDao(PgvZBVs00C3<#j22bVcj`h032tu$GLR5taDz+^YJ1Nxj zs*ze0guXK=HnHh0>@!WI&Juh$_A6%$N2Uye&xR?(l%W`pt?}`ASBll76#btmVVc0k zC}R*PM_(q9m9Pn$Uk7#QvC7yo5v`<;XtOoB-nv<|8~Kq9O!7{J;=Z~`@HU>q42ZEzM7wxej>{Te zO_>u(xzQawDGy0dmz2Z@k=`W{)n(}sU21O`*3W(yRX{K}6RJ+$?`lg&XZly6!SBZ> zxznJU>`w5W&^CtM{wIOGh)?o<7Bd8U1HAXNJz=-t(%ufMbI_%*Rou{?J*%S|<)P#> zkE1kfv2IL92YLeaiu8bAEJvRKZd*4Evq@wPad4v3;;>o}h`lN6^Nxi1AIIT*U$YQp zWokPHU9MsU!~PQcLw+IgGTbeDd9>ZN7kKz8=t`4wyIujI@7r+ti+yDB>2C+Za@k>( zyIzBk)zh^PkLveO6BfQ2*%?>jHoMH0@LJGr*(Has0kYbU@hwH*C3%6hlX7`mmduo9&)F3 zk*t#DwlRgm+)*&37_LYv*Q57eUad(+Wjb|(!q-8ZeSj8Z#fA;m;lKdL9$X4vPt9!7MP|AsS&uwxq*_UKeE$vN_rrZ7TcKUN9Wj^%i^YMi?Nbt2Uhona`KJ)mDqJFKkz^bHF(zFi+w(Bi&Jx7z0##DcRAed*ShVl;Z+r5HoXScjM+_g(J!96{uHu9e_jZ#DuOhf+mDt;q~CAi#DrE zz~ry}syt7<4jkC;He-b|59ar2KSM)d$u$~^U)6>;Kk!lJ}L=i?De2AET|pI3Ng+Wtmv z(w?apG7P?!qJoV!>FXB9);LAR-NVfg>JyMhG|gLC5@Pjf#7fbO(Wyv|J^_#$z5`Q+-G`+_f|*NxY-A%h z?zYiG`W@J#iQmt_#&Q3t1~yFRR~2gPu7c(-0SBWZZr1;DR1e|)w?X_*h~Y713891S zs2???{r~ooweL*OXCgRt43Bf(|5*@kT}@4?&z)iPSe#RwDu}0P^uLSYvCsei7sUUB z7~YY5Y4y{B`0+m)#AD`wOZlI>+`?$FM&N||q7Cgq);)k7m$dIk`-B=TXUrINGnyO% zHcLyo%}Ax))R3*BiQc5Z{Si{#*x`%XoOj=BM*Q&%nBWSk%4btGN`Q~*&( zvh|2c%gV4E=*AE5xHC$fn3hp6X6Fn%aFnhL*wBtc8ytlzLq3b$x*dkA1KN}4KfQ2 zhgWv;5Tt#I$_7bCM+0P%Uv;T@9ZBFt>HxYa=4T&TirEK`bLM#Ju&ezPXyGCe0$ITL z-F}X~KOkl=ztm1)WI`;NVH~_A3?eLMR4n3?&0}uG$rj<6T(&!QM*3 zWeF~v8q0TD0>z>h%&2#ndDLJ#s(C!}^0K z2hxI51e_W@fRxB~U6is#^Xv#m9!xNT`_cMANU)AylI%l?ByR-M3Y9?_167e<(Hv)x zp2#D58Z}w)J!B8eN-2!^-pHc~q3DRDl6kHJFfe!zS(#iiB?U%Bb|mGTLOJ16yNc4O zV|XHu>B&U+0`8QOi5I;*sW4&$caw?Ul#+-a7#1suXWK~Gb|!QqPQoaXJ1}7FktdA$ zQ-6$GpcA!v79xCs))aGy7kxg-9Aflm4)Fu!F>`pfcazK^h6;PI2*mB-%|SyVZjMeE z<`CfvzKxovSVZjTcS#lzqd$v?AE<~~1WJ{np|pgDC><7IIHX!cBQtK1P8b#u;R_Dv z+cSwB9Z#Ac)E!BTek@WuDIri9Gl}P$nPd?$Jdr08N?;y_XsUTMWCFwKUw9X_>#ucj zK9ZgSuD`7jdHN*wcojMO;nPIZ51S^Pe%Let^~0vgs2?^>OmQ|ZUpJ9z8s`(Pv#A&N z!={$%hfRGdnH@;$Gm6P4QJhU14TBe1h@;OLCyiY0*Xmf?5ao$HlW=164$?!z7^9e` z>3A2>38RY;;R~WoQadfNqw21>DY}Y&`UqDYsEL`u^L>=mMTmi3QQWszP$R}I(h0*N zB7A|>7(HL1*wG_NB@?4R=MXZxM!32gY&3sr`9AywMr&V-$DC zjU~b`mer=(N=ZLvD^Gui<`WUSpOn_;S|4%Ji&TcO#PI|&Qw$|uV&Gx~NP($=v=l|e zjJ}doX<~RIyLE385uAp?`zYqB#=`@8{7qX5Xf8?7Ow8z~Nt%ff*Gxoznz^dlSf`*3 zO7KEzf!Y+^#E+hUZZ%eY;soaRF_Savl9k0f6zz9{4OFwb6wSns<_$=60%Dw`m^16+ z^(Qi}nYK@Xi-I|Qn~eC;QAwJK5o{t8Qg;DdK|{=H+JeP96A>vr2J27C#7P1HXE48S z;lz)gpHw&(4D}h2oY|OMaE;g>l({1hHyC)Lads0|KzIF&=qp30#v zn989pp30%Y#W|P*4b?PwQ-x@vNafI+l**y`GnGSAe=3JotyB&zsX9lE6;F$Os!-WU z9NNsM$`mI!ax|2I*4PWrEx(rTVqVcbyq6q2F6Q9KtDGAh1KBWUUy6aE@e=`b6RvR| z7vj4UPXwzn^&f7|>m2ulbzYd0_^zJBU%5xuV*FZ*e+!LYKH*fENwF_awE*W=3Ei$Z zR}CFp5NErA#ZHkgh;uW61v2+Q}@ z=4JGTRBwK7H?|9L1pyZX{k`4LFBxatCgw!V2GXIMXp+MF;RAaqlLzOEopq2JJP;TA z9JyZXIDo{idTVGfnjCTGviq|4Nx*i~5L=bvefSqhaLY5n$lEptkIBvwrvb;?t z{vFM9-llpp{vI{=ME(F6c^5$c{uEAkaptZ2jyo4G8}$+7EgOcz&}qEk_qhMUf22og zTJ$bdQh$+6|LzWE1pT`^{1h2oEcFzb82y|g%WQxd-*_Tp)sFX}+RkAbhYsV&82u6_ zsUIMfzIF-pLqaDc&@&V0L_+my-$#~;vBOhR65rPm;f;L61v-fc?iUaP1pkdnq^ygS zmU4haj6hqTP(xR@BcU$(9lR4;jwlt&5ll~6j<}JY$j5rFX7qp9_eqSRi6(M5i5eRi zAE?uVluwB*BmFZS8IPp#deY~d6AP53I!}(L<4@p4{>&4?Ul4vo$Nxh3mpc9x&A*Yq za>5(=nx48B<;Z^}i0sHW2_kY7c+UDw##}(n!6yJ}4BS?VozxUtBY&eDmYA^?GBw3m zOUzicueFvWYc1h~wU#ifHH@`nCmU;t{5@fxC-QBA2u!Abx{v;mVCUy2TATJD)V;Dh z{z>Y;OGrh{3R?5Q1j8Ho7ZKK2t*j^2${MRx-%44NDrHTo6yCl})XJLD1lGv0MA4oI z`e>|i0+S>ENl<*c4)`M9Cs^Ld4+$dpxPUHh14xPKsLr_v>GVAaQ7N7ExUPVjci@_J z_ti&EBpA^`atsr=K_n5aBZiP*cq5`tP_G#HtIFx|{KSY(Ny@Ks&b%ZA#E2`P-ZU_4 zabZKu0AfTtk`!=;nv|ayvHT(*=3x`JW+3Y)5>zqAy~OLrgTP=Q<|rc)^n@jz*$C3e zQK=CSjdO$J37fgBCoJ=4^hTIPK@M8Z6Sf#>Rz2-5GI@BC|0DYh!Pn?HxIVFfPo}w; zR{OJ17GLc-vW6z|bE$Z=u6;QIUm=Xj(^}7`>%p|vi)?yqiq?hs&k#hgj8b=^FEdNg z=g1U%!CL1)p96R#9RPRGSTS;0^cAYfN*IRMo?s5I%6~pWYHU-^q?(v{T;!N1=u^X0n#kpB&SO|N|_Zy5Mxl_ue}s=J=2iRgLnKQ zNjDMLz3Ax}zbFTz)kqh^Ib_OdgJ*P{N7m$mT8<$nc9RUIfv}gVHF$>Dxf={qb|eoH z_!7JikHJGbW+PMg9&N|mEVbB>WrH`Mk+B1ojGtq{%qJzijG}Rc3F+%0{c=n?dWhUx z2@(BgTXbPwL78D0(EpM%d}m}(?a^Uwwp27;=;m+giTthgb(hhk<%hw#Vr;MNk-k=Z z2rJM^Qj#ePxjIaklCI%evZ}9X@qBXtH4swe1Ovb)&gExID`(_URiZLrZefoq( zO1uESxRj>ty{K5-1`6GdK|foF&vJZF44Z)`i2_B}VhsI+nelPppZjkPWBLR7b^ zWG@#|VQ=TnD{`_=fIC^5kLXN9Vhk&rAHEkLvm|_sZ=kz{%dpJ>bh{e=Xjd zm(LF6?#*+trc9Fj8GM${mKW^J`-pAD&~>pZp*f#@$0a{d(@50I+v%{I68`Nc&gH;e z>@XbbVk(DU`v@P8dbrqjsCKbO;n;jO!9zuk;_7T6%DW9Fx|pBKJkIkz%=KsSdN1I7 zE9XSQDv5?cEEErM>kjbb8gv#Hb8@FWA6|?;F@X02M+tdiHEK+w`&}CNm;q?4XRw`C z#?FdU$1oWXCE}C8a)U%!vDA?4ZOGk*)hU-@Bb>nwW36jrb@)f32RU^X=Jsy9{ku9q z8K=_k!Xd4G;L(9ZVd+NNw!)(WhX~VYs)E+TFy<`aGx3{uj2+6P-;!HsPyvK@Q`ofz zMJw18wvJN>#8%_zXbSr^NE4JsQP5dzH&F!{Y?ngR9(F#`FyBGVKiG?yJxOu|rogj6 zUBs#VoO+qf=hSK3n0+`MA<5@B^*UR?u>P|@V;Zdx4zNW;sca=O#z`haG(pv)K%ElU zSociCln=W`Ba+YK_-qb8cZ~z*6%IxBIIF^LH|2>6e$|CwvpEm$aJgzB6A~K$f9oD? z_26~GnSzIXEUKi`DxQvn2ZhN$CFdr&B%wnbtd%c9;!PPlrQhFDMr4}mY zK|mBB%@o}1L3SSG-vq~lHYV5(Z34SOI3K0dnF#J>7Xp68=BaqB7cK_eEi3>G31s8K zbb>P^f`w*+{}v*EUkb|s|IStcI!pwIN(8-Tg4;Rt$%LP8BKdg|!E!UfS2=uwYkQc> zgyjaSDzK;U5Lk<_8nDtrnRjrw&P4oW+-V1dtAMX`oo6+{PuBvcTET0605?;L`&LHgnEq&RN1a?{H3@ zgHpG1em>{?+ew_)xJ)UB@2Z^jB!@1}`h>%8c!qS&m$-_FobTj(W+O!khf}SDU(99Z z+6iw&u9&$Gr0oUgHV!)gWBj#guYo@@L#4-;HiCkkpf`iyFbBaK6@pEivuyz3S8{xy zlkj6)ekIR)1(&Sm_^&v8gTo+)=kda>;Tk^W_|shfgXyoSP_!nU)ZNNi6S<DZJn}Ip;>*2#ycn8X6&^dqSPj?M!@RWo=h)ZQ$ygB>yGG64gh)qVvpIPcsG}GfkLZckRe7`Vdknh_YF%CiLe1R< zCFTCdYGtn)l#+V_)FFeKf_ygiu0gdSpN$H)oU@!+u7d@GMc*` zbJl+hY7L^;G$s}3qLY#4U=D+7MVfgK|T zFo2Ck49xJeQXAFqmr@3Mz#wZxyG>zbg?i#zQL(w%XGJ>ogXFbk;oGD-b)(s9^D=z> z6@S-oALg)XPHoKYEwD;C?AnyH*~KK;!yd;fn!_G2sDq-4wV8cokXe%7md73~(M6Ag z@*@V;sTDrIEx_gvA?g}-6ONn;*d~KA$pY?)UgcB|yG0J!3fcDtRh&1(21|zOS_WE% z*h*NLL2a>&P;GxCA99 z?qm(NO7^%x{Z^c4t6~}BC~YIll&085uxmMW4f@$ETQ!qvDXoWHD9*R3quK48yoTLn zYPXGH)_OhhX4HN>d*7fYn*Fvqb|r0yQ2Texvuq9Q8&37Gv9jOR#J*_O(<1&Aw$mAY zeg%I$>~}~zgPn1PPJJVev7O28!N!cV?9b@5O;TAE4$p|ZS-Qq{4!Z>hJ48)1ueVKR zSD!^x4_jgh*=Dd`8`Mj1VhelKpxn%Fo5fx|n~2t3aZ2xAbJ+t%#>cUHo6F|T)72cr zXrIeg&etjGL37zxoYIZCh!wTzX=KbiHhuw7y3ToQvZ|BTO5tAHJl0}RwZbn!wQ`F3 ztlu`DU2RYYMZfK0_PIe(ftRv>aY`?60V}6{tWo=g?7qcBZDe=(tT@IG7Tp2x+>CQH!o%GdUGg zGtWrVCGSj;{9TIV2Pu*incri^=@G+Mqha#9BApcc0=SvI06zAAdqD_n7|tMm8tlgG zD6sc32r8JI1a>7jqQTiF5dJrGxBF4$cFd4<4U>O-Af@qRC0%s;_Cc?cWFR>H6_NOW` zS;I#Gw12Gj)HVV;bvBZ8$YjbT*cAyzF;tky&I1P~!gPsU2;9u3n=>+G_Az($sdR#m zgLuRF&*qWRLtNcv?r^zxiocCL@= zLCFHUv)INq6`+#=%2+fv71-GzzzkNwVGW0M98TbH3WqZ}Yz53>?Hpgm;VKTV1I)#A zL^`*#O)4Hwfe5k!kywKOi&+K7rvR3*JGf}O*euszBXwP2Ew&_Qd7A-u;ulwX#I!-3 z>^d>a*8}{{&|0=poE5qO@QlKnz*$+e2{2H6Ct!_lJ8})mdKiHV%__^p*F5UW_~jFw z_$G9O7my`v7Y~<&g?-|-@JOLuJZ!2JeB6j44tvBwgJuf*IR2DyQORuK6Y*A04|_^j zSdsx)=ek%pA|CKYggpXjeoCmxS}q(F2bNqf)Cf~OvjJ5=GIyg2!d#>iw+qKa=DSZ2 zOyj*WdP2aJ#g2*(IsPTo33s|r2or=)eX=+cN@eU`pZ9ox|HhXG*c>2O<i|R5VT0CEzU^?JfATAUBFmRc8NPI86 zQk-Ji>R1c-K;8`y{W^1_IFp;TN_Z!8HuunNVyh{HNUz;=H^R*x;n&`K#U5cm)^@g$ zo4CyM7yK&OGSj|b24K{a!B&~5ddp00sQpH9N#Wz-5tX~~2=j!pSdWR^b%gEoy&zs^ z;D1y0i5m@kn(Lr=guR1fw+X_r%x2RORvtRrbO^m+nrVx8ci#CX>K}8#Ig)#^iR!o1 zbO+SCPbZ4rJ~aIa~*@MXbv!0CnC*>>T{g6(Vv zM6nwdu64g++97NYyzUQw;$ZnuerMJD-} z&>C{cQ(%`%u43O8Z)eAZ^+hs%f9q>B(=kCQ%8_SEwf=zIDoJ6aiq{tx%g4kT3|ECu zS;x3z1&+5%JXKhLu6<1C;c#PS4N7sKl8U&sxK>tFvB{|M>9QhHjW%_AI&&r2P&x8-iHOTxsc_vq3 zGcR=gN$wFJ%lj{UeK|k(AHW|8{YTC*)3~>?577yFz;MIgKe(8{I@w_42XQ9;eb z<8i?Q_-i2>@L3@jaJS$Cd`ZX$d{qbn?iU6E9u$fI-x7)e{~&|`-xmf0ek_y$ekKeB z{6Z)P{7R?<{6?q({8ktV_%ERv@Oxo2AQQ&|O5$lM9#*jy&>_|XW{8b|nPM|wws;1h zPdpQ_NSp*17S9GO6DI>!aZa^J6&Nd01!~1}0UO0>fMCe4uN3D3UMXG#*e%Wnyjr{%@LKUwz;)sR zz?-;1w}^{?-!3iz>=ns#_lV@VUx?(n2SoDRLn3+ZQE@5Y<6_ieR@tw`Hb-b85Ud&vMw;GTN?&f%p0f}=DyFrC5TR3YA&$gT6 zdkjcIA9MT@0}_V`RGT1&g~B#=!d@u+5}ZQLspYW2fZJGI+5}-IyEAPr=gi}_n7RAEhx6xwTrHqq1N%Mo_au$oypuNZz7*^- z)nQUuD|;WrMeH-cdF(5|`RseZHYP1Mv5T1l@Di2@cq#J%wzDF@1x)Iu*gyF%6Z->f zY~p{SYFsJ}z`RH$Iv8WZ~n% z$BPb^jZY3fx%iAg1B}AwEc`6X6x?PV0bVHVlSTM?a@=GK0FRZ9! z7p+>}M$d-kipuhun(CUyrsl>`Rl`R#*Vk26){GcgQQ1^oRX4J}p{Z$9Ri(CPT~{o1eA z4=O3Igxxhw4b8*rt436gtQ^@;S2L<{W@IJvZiSuim&L++2kW z&GqGt%}v8=>PJ>L)KxcCG>ocgsBfyOsu@{b)i|Q6vZquEA5K=YST&4)a9+wZq*LoH&B!BpRO&w|4a!bH)wC&KU16h zz-ij%2eP!s9$2+=&h}&!YpuULXr30CzI3TJ^r3of zh*G?JRnBp=eDz7qau% zW!fuGmj`i>Jb|6fM&lJRVz)v?I}}|4P7sG5A#KZV*0|i$FwBFjo~^RjBFYac&9G>}jk#4H?T5w;iw zwc=27DJ&4QkDjm1=7x2E5rJVHC?Cd}uEaTQV0WXgnU^=*C~xuZ`Xp|Z!ToOcx0NMz zxMg1i{THK-i+DwX_#cK0#&yJCh+S!5ENv*3r!%lDP1Ux%aE12omx4RzzPw-1mb_A^ z{rQ!LUG8S&ZiOkALf5%uvsSy$yYux|118AK5VEv_kF#z*Fw%uviIwm}1%5$_uyWS4 zbIk#V;7C6mS7i}YcQLEj`TZM{aAp3&Mbjqz@ySh1R}Widc|*Q;l-6>nQV3}`9Lmid zC*-p%R}Vc*cEOyUAqaSfggDyshsHZ={bo~;S@9wvXF1-?w#IU3WpDb35O~VuH>=d1 znNFwDGe_xZwc*7GS5Ldrvl#E{+Wcm#$s*V+S+2#R({DCsxt0k|QFcPJ(`*q%*BQV> z$s)KWN!aW=dPHaAPi%yR&M_m6e%h_TV&*bu!EV&hgSMn5wW>?wwr?j`7g+j2`)Bt z!MEf}p9(~j;g9ZpI93-)RJNGNJunig_UMn7^~b&?mT~<%i@OY#qY%Ftt}(|w6-TW2 zHD~^ZwvGLBsogttX56t>(W#U>m1-`mJLUlDDhgJ-{YECWuW7cL|qRl-EX4>o-+mUqCW|Dznz|Dv58j0M!N;|c^6&K ztheR6PVV$~oj$t-ex-_7#R5x)YqGM+H4V9)$|^u;{=n7!2_BzNS1}`CQgEim1WS;L zP*&+h+09IJI(=yBnVE|i=0WH}f47QtDEfzEW2aBTBM&9^b zbc!NIn&Ek;otenRG&7`-l}|tLKQ)^H;qq9^qYrnjKC35B+fr4;ADOTx1Q77fi|;GX^kEUc(2$ z8XHgS{($m39l9ibXHyg$oKV(e>C%35GyHBFje<1=+=Rc{Y2?uy|=rx0onNm411cYl%g<ggAW7GfB%d62J;~YUV>{8a$DQlX{ z7{aK5o^lpFkVB`YaIMqPvoK?&oeXj01jOQNX`7#X{zuBM;SeR&~sf^D$_#XlwB*t7}6k|p%L9{|Mx~S9Deaxrl`Kvbm1CQ%27)Omtus{L~@4V!LO~RUwuK7rK z@*{Eo?Vfk`PxvQo-9&sY$LAsZ|8pOjcH800O#?G-ef61!dp|EY^Z64`{B_@m_wTqZ zbERpXYa({5vA;ILgBuGx;&~mnZCPm=URoiX5VGH6M@K>=`@N$X7ai@vlN}w!X?7H$ z52s7&*=--KH07LE<2?=Eq|uqN=RjoIbJ>wgh>kq5>F+UqA>N*h?LF~3kaWk#%1&#! zm7Y`x?g067;L)3IJ8zX~*RG&T8Y|r9yu$RU(6j4rSC~d^lw1hm diff --git a/bin/Debug/FlashToolTest.pdb b/bin/Debug/FlashToolTest.pdb index b82f0bb753aad144db63d2221480c740b903297e..a2bdf143428038dd5dee360ded2656fa8c9f07be 100644 GIT binary patch literal 124416 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

b*TJhD0)3+GiIxl{vUEEE4~iaxIC%+{y-Dd-3P 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 literal 99840 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 axz`>Hrbhv<0*Uv<0*Uv<0pY3;Yiu0=UNj