diff --git a/.gitignore b/.gitignore
index 0f0f603..6326f45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -243,4 +243,5 @@ paket-files/
# JetBrains Rider
.idea/
*.sln.iml
-Todo.txt
\ No newline at end of file
+Todo.txt
+Thumbs.db
\ No newline at end of file
diff --git a/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3 b/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3
new file mode 100644
index 0000000..6d6f327
Binary files /dev/null and b/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3 differ
diff --git a/Docs/ASCII G Protocol.md b/Docs/ASCII G Protocol.md
new file mode 100644
index 0000000..5457bb6
--- /dev/null
+++ b/Docs/ASCII G Protocol.md
@@ -0,0 +1,29 @@
+RDS data is provided by the RDS encoder in ASCII representation in this format:
+```"G:"+#13+#10+"AAAABBBBCCCCDDDD"+#13+#10+#13+#10```
+where
+AAAA is PI,
+BBBB is block 2,
+CCCC is block 3,
+DDDD is block 4 of the RDS group.
+
+lets decipher this a bit
+#13 is ASCII character for CR (Clear Line (\r))
+#10 is ASCII character for LF (Line Feed (\n))
+
+so in human readable format this would look like:
+```
+G:
+AAAABBBBCCCCDDDD
+
+
+```
+or in computer form
+```G:CRLFAAAABBBBCCCCDDDDCRLF```
+
+in C# you would write it
+```csharp
+Console.WriteLine("G:");
+Console.WriteLine("AAAABBBBCCCCDDDD");
+Console.WriteLine();
+Console.WriteLine();
+```
diff --git a/SDRSharp.XDR/Protocol.cs b/Docs/XDR-Protocol.cs
similarity index 100%
rename from SDRSharp.XDR/Protocol.cs
rename to Docs/XDR-Protocol.cs
diff --git a/Recievers-I-Use.txt b/Recievers-I-Use.txt
new file mode 100644
index 0000000..53cc1f4
--- /dev/null
+++ b/Recievers-I-Use.txt
@@ -0,0 +1,3 @@
+sdr://188.25.106.73:5555/ - Romania - Stations from Romania and Bulgaria receivable on 100.5 Rock FM in IBOC, It can also be seen in the README
+sdr://212.139.208.227:5555/ - UK (Kent) - Stations from UK and France stations receivable
+sdr://212.187.114.164:5556/ - UK (someLW and MW only) --- 747khz MCB Radio from The Netherlands is good choice for listening at daytime :)
\ No newline at end of file
diff --git a/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs b/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs
index 32456aa..3695ad6 100644
--- a/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs
+++ b/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs
@@ -16,6 +16,7 @@ protected override void Dispose(bool disposing)
if (disposing && (components != null))
{
components.Dispose();
+ toolTip1.Dispose();
}
base.Dispose(disposing);
}
@@ -28,12 +29,112 @@ protected override void Dispose(bool disposing)
///
private void InitializeComponent()
{
- this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedRDSWindow));
+ this.ipLabel = new System.Windows.Forms.Label();
+ this.PortLabel = new System.Windows.Forms.Label();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.textBox2 = new System.Windows.Forms.TextBox();
+ this.rdsspy = new System.Windows.Forms.RadioButton();
+ this.internalrds = new System.Windows.Forms.RadioButton();
+ this.UDPListen = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // ipLabel
+ //
+ this.ipLabel.AutoSize = true;
+ this.ipLabel.Location = new System.Drawing.Point(12, 43);
+ this.ipLabel.Name = "ipLabel";
+ this.ipLabel.Size = new System.Drawing.Size(23, 13);
+ this.ipLabel.TabIndex = 0;
+ this.ipLabel.Text = "IP: ";
+ //
+ // PortLabel
+ //
+ this.PortLabel.AutoSize = true;
+ this.PortLabel.Location = new System.Drawing.Point(147, 43);
+ this.PortLabel.Name = "PortLabel";
+ this.PortLabel.Size = new System.Drawing.Size(32, 13);
+ this.PortLabel.TabIndex = 1;
+ this.PortLabel.Text = "Port: ";
+ //
+ // textBox1
+ //
+ this.textBox1.Location = new System.Drawing.Point(41, 40);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(100, 20);
+ this.textBox1.TabIndex = 2;
+ this.textBox1.Text = "localhost";
+ //
+ // textBox2
+ //
+ this.textBox2.Location = new System.Drawing.Point(180, 40);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.Size = new System.Drawing.Size(100, 20);
+ this.textBox2.TabIndex = 2;
+ this.textBox2.Text = "8888";
+ //
+ // rdsspy
+ //
+ this.rdsspy.AutoSize = true;
+ this.rdsspy.Location = new System.Drawing.Point(12, 12);
+ this.rdsspy.Name = "rdsspy";
+ this.rdsspy.Size = new System.Drawing.Size(133, 17);
+ this.rdsspy.TabIndex = 3;
+ this.rdsspy.TabStop = true;
+ this.rdsspy.Text = "External RDS Decoder";
+ this.rdsspy.UseVisualStyleBackColor = true;
+ this.rdsspy.CheckedChanged += new System.EventHandler(this.rdsspy_CheckedChanged);
+ //
+ // internalrds
+ //
+ this.internalrds.AutoSize = true;
+ this.internalrds.Location = new System.Drawing.Point(150, 12);
+ this.internalrds.Name = "internalrds";
+ this.internalrds.Size = new System.Drawing.Size(130, 17);
+ this.internalrds.TabIndex = 4;
+ this.internalrds.TabStop = true;
+ this.internalrds.Text = "Internal RDS Decoder";
+ this.internalrds.UseVisualStyleBackColor = true;
+ this.internalrds.CheckedChanged += new System.EventHandler(this.internalrds_CheckedChanged);
+ //
+ // UDPListen
+ //
+ this.UDPListen.Location = new System.Drawing.Point(12, 66);
+ this.UDPListen.Name = "UDPListen";
+ this.UDPListen.Size = new System.Drawing.Size(268, 23);
+ this.UDPListen.TabIndex = 5;
+ this.UDPListen.Text = "Listen für RDS ";
+ this.UDPListen.UseVisualStyleBackColor = true;
+ this.UDPListen.Click += new System.EventHandler(this.UDPListen_Click);
+ //
+ // AdvancedRDSWindow
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(800, 450);
+ this.ClientSize = new System.Drawing.Size(289, 200);
+ this.Controls.Add(this.UDPListen);
+ this.Controls.Add(this.internalrds);
+ this.Controls.Add(this.rdsspy);
+ this.Controls.Add(this.textBox2);
+ this.Controls.Add(this.textBox1);
+ this.Controls.Add(this.PortLabel);
+ this.Controls.Add(this.ipLabel);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "AdvancedRDSWindow";
this.Text = "AdvancedRDSWindow";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
}
#endregion
+
+ private System.Windows.Forms.Label ipLabel;
+ private System.Windows.Forms.Label PortLabel;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.TextBox textBox2;
+ private System.Windows.Forms.RadioButton rdsspy;
+ private System.Windows.Forms.RadioButton internalrds;
+ private System.Windows.Forms.Button UDPListen;
}
}
\ No newline at end of file
diff --git a/SDRSharp.XDR/AdvancedRDSWindow.cs b/SDRSharp.XDR/AdvancedRDSWindow.cs
index 1040a49..6f9df79 100644
--- a/SDRSharp.XDR/AdvancedRDSWindow.cs
+++ b/SDRSharp.XDR/AdvancedRDSWindow.cs
@@ -7,14 +7,67 @@
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
+using System.Threading;
+using SDRSharp.XDR.Tools;
namespace SDRSharp.XDR
{
public partial class AdvancedRDSWindow : Form
{
- public AdvancedRDSWindow()
+ private static AdvancedRDSWindow form2;
+ ToolTip toolTip1 = new CustomToolTip();
+ private AdvancedRDSWindow()
{
InitializeComponent();
}
+
+ public static AdvancedRDSWindow Instance
+ {
+ //singleton design pattern to return always the same instance of a form
+ get
+ {
+ if (form2 == null || form2.IsDisposed)
+ {
+ form2 = new AdvancedRDSWindow();
+ form2.Text = "Advanced RDS Settings";
+ form2.NonClientMouseHover += form2.TitleHoveredEvent; //Hook into TitleHover event
+ if (!XDRPlugin.ExternalRDS)
+ form2.internalrds.Checked = true;
+ else
+ form2.rdsspy.Checked = true;
+ }
+ return form2;
+
+ }
+ }
+ private void TitleHoveredEvent(object sender, EventArgs e)
+ {
+ toolTip1.Show("You found the easter egg", this, 0, -100, 10000); //I have to write something as text otherwise tooltip won't appear
+ }
+ private void rdsspy_CheckedChanged(object sender, EventArgs e)
+ {
+ //Enable adress,port control if we are using External RDS Source
+ UDPListen.Enabled = true;
+ textBox1.Enabled = true;
+ textBox2.Enabled = true;
+ XDRPlugin.ExternalRDS = true;
+ }
+ private void internalrds_CheckedChanged(object sender, EventArgs e)
+ {
+ //Disable adress,port control if we are using Internal RDS Source
+ UDPListen.Enabled = false;
+ textBox1.Enabled = false;
+ textBox2.Enabled = false;
+ XDRPlugin.ExternalRDS = false;
+ }
+
+
+ private void UDPListen_Click(object sender, EventArgs e)
+ {
+ UDPServer.listenPort = Convert.ToInt32(textBox2.Text);
+ Thread RecieveUDP = new Thread(UDPServer.Serve);
+ RecieveUDP.Start();
+ RecieveUDP.IsBackground = true; //if this is not true we won't be able to close the SDR# because this will keep running and we don't want that
+ }
}
}
diff --git a/SDRSharp.XDR/AdvancedRDSWindow.resx b/SDRSharp.XDR/AdvancedRDSWindow.resx
new file mode 100644
index 0000000..9296fc4
--- /dev/null
+++ b/SDRSharp.XDR/AdvancedRDSWindow.resx
@@ -0,0 +1,984 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
+ IACoJQAA7h4AAAAAAAABACAAoYQAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAATCwAAEwsAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAvKypAP///wBIPz4MFRISHhIPDx41LS0N/+/pAP///wBBOTgNHBgYIBIQ
+ EB40LSwL////AIh5dwAAAAAAPjY1AE5EQwwlIB9pDgwMwgMDA+ADAgLgCQgIwhYTE20TEBBrCggIwgQE
+ BOEDAgLfCAcHvhIQD2IqJCMLIBwcAEM6OgwTERGSBAQD+gAAAP8BAQH7AQEB+wAAAP8CAgL8AgIC/AAA
+ AP8BAAD6AQEB+wAAAP8CAgL5EA4OkUc+PQ0XFBRwAwMD+AEBAfsODAy/FRISihUSEokODAy5AgIC+gAA
+ AP8IBwfWFBERiBUSEooNCwu+AgEB/AMDA/gYFRVyBwYG0wAAAP8LCgq9LScmeikjI30mISB7LigoexAO
+ DrgAAAD/CAcH4CUgH4UkHx55KSQjeBEPDsAAAAD/CQgI1gMDA/sBAQH+EQ8PzxYTE8MvKChgMCkpViUg
+ IHsYFRWIAQEB+AUFBfUpJCNlKCMiWxIPD78PDQ3NAQEB/QMDA/wTEBDLEA4OwAQEBO8CAgL8FxQUeR0Z
+ GG0XFBSJHBgYfQICAu0DAwP6HBkYcRoWFngDAgL8BAMD8BIQEMMUERHOIh0dgCMeHnUPDQ29AAAA/wIC
+ AvoDAgL8EQ8OsiwmJXkNCwvDAAAA/wMCAvoDAgL6AAAA/wwKCrslICB3IRwcgCAbG1UkHx59KiUkhA8N
+ Db8CAgLqAgEB6w8NDcInIiF/Ix4egQ4MDMMCAgLrAwIC6xAODcAsJiWFLicngyYhIVgoIyMNKCIiZjIr
+ K4ctJyd+HBgYexkWFXkpJCOGIx8eoSciIoMoIyJ6GBQUeRkWFXonIiF6LScmgzMsK21DOjkQNC0tADcw
+ Lw0qJCROIh0dciAcHHgkHx96NS0tfTQtLF02Ly5bMCkpeyIdHXkhHRx5LCYmeDIrK1I+NjUOMSoqAAAA
+ AAAuJycAPzU2ASQfHw0XFBQdHxsbH0pAQBJvYF8BjHt5AVdLShMnIiEgIh0dH0xCQRCHdXQBcWJhAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//AAD//wAA4YcAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAB
+ AADAAwAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAATCwAAEwsAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9p6QA99zYAl1RTx8qJSRVEhAQewQDA4QQDQ19HhoaVj01
+ NB+3oJ0Bo4yNATEqKh0nISFZGRYWggMDA4QRDg56HhoaUTQtLBngxcABf29sAAAAAAAAAAAA////AFlN
+ TABqXFsPMisqdxQREdsFBAT7AQEB/wAAAP8BAQH/AwMD+wwKCtofGhp8GxcXeQkICNcDAwP7AQEB/wAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAwAADAPAABwD///8A////AP///wD///8AKAAAACAA
+ AABAAAAAAQAgAAAAAAAAEAAAEwsAABMLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLu7gD///8Ahnd1CUE3NxoSDw8iDQsLIjoy
+ MhxjV1YK////ANzR0AAAAAAAAAAAANHCwgD///8Ajnx6DVhMSyEMCwsiEQ8PIjw0MxpqXVwI////AOji
+ 4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyjogDpzMsDbmBeMjUuLX8ZFRW8CwoK2gMD
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
+ //////////////4H4H/wAAAP4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAYAYAAGAGAAAA
+ AAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPgAAAH8AAAD/4DwD///////////////////////////ygA
+ AAAwAAAAYAAAAAEAIAAAAAAAACQAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AMOv
+ rQdpWloVPzU1IwoJCCQFBAQkNS0tJGFTUxiOfn4G////APfy8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD59PQAAAAAAMqwrg6RfXwjNi4uJAUFBSQKCAgkPTU0I2JUUxSmk5IFAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAANW/
+ vQx6amc8RDs6fCciIbMUERHRDAoK4wICAuQBAQHkCgkJ5BIPD9YZFhWyNCwsgU5DQjugjowMAAAAAP//
+ /wD///8AaVxbAI99fAlFPDs3KiQkeiciIr0gHBvkCgkJ5AEBAeQCAgLkCwoK4xIPD9AcGBirMisqclBF
+ RC96amoEZlhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+m
+ pADjxsQGfGtqTEQ7ObgZFhXxBgUF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAMD/w0M
+ C+8qJCS3Rz49S66YlwiaiocGQTg3RiAbG6wNCwvuAwIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/BQQE/g4MDOYgHBucUUdEO6yWkwKAcG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8AhnNwAKSOjBxPRUSVGRYV8QICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8BAQH/DQsL8jIrK6ItJyabDAoK8AEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Dw0M6CciIXxjVlURNiwsAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAPPk5AAJAwIAfGxqKS4oJ7YJCAj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMCAv8DAgL/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUEBPweGhmsTEJBIAAA
+ AADt4uEAAAAAAAAAAAAAAAAA6MrHADQtLABZTUwgJiEhwgQDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8CAQH/Ix4ewnNkYylaTk0AzbO0AAAAAAAAAAAAgnBvAJeDgRcqJSSxAgIC/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ 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
+ FKUTEBDLFBER3Q8NDd4ODAzeFBER3xsYGNgwKinGVElImm1eXUW3oaANTzMyAP///wD///8A////Acy2
+ tBJ+bWtNUUZFljszMtAoIyLlFBER3g4MDN4ODAzeFhMT3yEdHNkxKim8WEtLjHdnZjrPtbQJtJmXAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8AGxASAJaDggNYTU0QRTs6IgwKCiQFBAQkPjU1JHNkYxnNtbUM////Av719QAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD/+fcA////AeHFwBSfiockPjU1JAUEBCQKCQkkTUNCJJB9exrUv70I////Af//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
+ AAD///////8AAP///////wAA/+Af+Af/AAD/AAPAAP8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAA8AAOAA
+ AAAABwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAADAADAAAAAAAeAAeAAAAAAB4AB4AAAAAADAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAOAAAAAABwAA8AAAAAAP
+ AAD4AAAAAB8AAPwAAAAAPwAA/wADgAD/AAD/4A/wA/8AAP///////wAA////////AAD///////8AAP//
+ /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
+ AQAIBgAAAFxyqGYAAIAASURBVHja7Z1ndBPH97DvqhfbsixLluTee7dxAduAwfTeQ6ghEFqAkEASEiAJ
+ ISEkhITQe++9u+JucO+9917lIkua9wPJ/w1Ykm2aTX77nHMPB2v3zszdndkpd+4A4ODg4ODg4ODg4ODg
+ 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg
+ 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg
+ 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgvLdgA52B
+ wUh8Qq15XnERrb6yEsrKCqGsrBDKyyugoiIDOjslUFtbBm1tbT3uYzAYoKWlA0wmC4RCIQgERqCrawA8
+ oS7weNpgpGcAHG2e1FgbSxvoMg4kIdliIksmsyYSiRiZTAISCYBCBiCIAerqmqCwrADKy8qhpqIQSkuL
+ oLKyECoqikEkEkF1dRW0t7f00EmhUEAgMAAGgwxCoRFoa+uCjo4R6OgYA1uDC3rGpiDg8YBIB9DgQIkq
+ EWscaDsMBv7nGwCEEPX48Qe+eXkphKSkZ5Cbm06aMXPJ3hZRh7CtqQkaG+ugsbEWmpqaoLGxAiQSGbS0
+ NEBXV1cPXRQKBdTU2EClMkBdXR3U1bmgweaAKlsD1FTZwOXwgM3ltT2LDlmjq6PfYm1tD9bWQ4DD0QQS
+ CaC9vbvZwoISPtA2eZtkFiIvMoB1R1f3HnF3N6m1tRlEohZoaW6AproaqKqsgLrGamhsaITWplpoaKyH
+ pqZaaGpqgK6uTmhpaQGxuKOHXhKJBCwWBygUErDZmqCuzgE2mwtsNheYKqrA4fGBzxMCW1MLJN1dJ7o7
+ Ou9ZWDgBT4sPDA1CpR4Xix9o2wwE/3MNQERCrVVsRNCYsODHkJ4RAx0dMoGTk+sXjY3VUFlZDlVVZdDa
+ 2vL6CSmATmeAQKALQqEe8Hh84PP1QCDQBYFAGzQ0BNUCgd5uda6mDAMAsaRb0g5w3N2C2j7QdntVkvKk
+ fAqCeRQyAZqbWgnl1SVf1JaXaVVXlkJ5RQmUl5dCfX0lVFWVQFVV+Vu3PVdTC4TaeqClpQsCgR7wtLRB
+ VZ2V3dnWedjbdxzwBEKQSRFgkm7oRCjbyZL2YKBt+Db5n2gAAgPzvwoNfaQXFnYXWkXtdlQq2bOyvAwa
+ G2ugubkFAKQDmj8ajQGamlzg8w3A2NgKTM2twNzcFoyNLUBdTf2iWNLdLCOR45ysaMcH2pZ9ISGj8yMq
+ Bi7SbgmI2tt0C4tyJmRlpUJBfhbk5adDeVkxNDbUQFtb60BnFahUOnA1eSAQGoChsSkYm1iCqaktmJva
+ gIoaq4wIcE8sFp9xcmJHD3Re3wb/uQYgJCSXQqEw7ESilp3R0UEQERGAtbW1etXWVlEbGp53JWWyga3w
+ vaGqwgINDg90dPTBzskdHO1cwNDEuoHD4cdTMGyvtQ3zIYZhaKDz+Q8puVIKlUzAWusbfYkEwvpGUZNz
+ QU6mRkrSM8jIiIf8/Cyora2Gtrbmgc5qrzCZKsDh8IDPNwJ7e0ewtXUDc3O7bAaD9mF7e0uqhZU1tEtB
+ ammASQY6r2+C/0wDcP9+qlpk5EOOgYHZucjIcP3U1BjtsrICaG9vGxRfmleFSqOBClMVeFq64OM9AVxd
+ h9ZgGGGBQCBIsbGxAQIG7do62NvrNyshO1uiRqQTNZpbRGdFba28koJc9fiECF5oyF0oLioAkagVOjvf
+ 29ELUChUYDJVQUdHD8zMbMtHjZossrV3AzJdJUiDzfqegAEQpajWwIgwuL8oSnivGwCEEPX69TjrP//c
+ DjY2jt9kZSX6Jic/U2ttbQWxuPO1dJNIJKBS6UCl0YBMpgCRQAISiQwEIhHIJCIQSTTAMACZTAJEAgmk
+ UgTdkk6QyaQgk8pAKpWARNIN3d3d0CnugE5RG8jQ6320yWQKqKqqgY2Nq2jkyAkSBwd34At0ArkCrZ0U
+ gFxdPeytt3SFmZ2ULjLZhkYnQHlR5dd1zXWjczOT1CIj/CEyKggaGxugW9z1WmkQiSSgUmlApdGAQqYA
+ iUQGIpEEBAIBCAQSUOlUkElkQCCRAEkxAEwK3eIukEqlIAMpyCQSkEgk0N0thq6uLujs7ACJpPu1bc9g
+ MMHJaSgMHeonsbF3FRkamIKmBmeVkRFcwLD3syq9n7kGgCtXYseGhd12kkrR94GBd7CCgixMJpNg6BUr
+ GZvNBU1NHqiqsoBCo0FRQdYdoVC/W8/YHPhausBW0QB1DQ4wWCxQpVCBqa4OgIgABABMCkAkIahvaoJ2
+ kQhEba3Q2tQEjY1VUFVbDQXFGcCg0J1IRKphW2sztLY2Ql1dNTQ1NbxSXjEMAyKRBMbGFjB85ATk4TkK
+ 6QkN/9A2Ngo104e7GIbJ3rS9EzI7vehEIo9AJJm2NDXsyM3NwGKigrHg4LtYVlYySKUSeBXbEwgEYLM5
+ wGZrgooKC2QySV1RUUGorq4xGJqbgY6WLmiwNUFVlQNMJhMYDHVQ5agDQYYBEAFABgAYBqKmRmhta4IO
+ aTuIGhugvr4BqqtLoaSkEEpLC8gGBpaTOztF0NbWAs3N9VBXWw3SVxgKPrc9EXR1jcFn+ETwGubbocnl
+ b7Bxdsw01sbC3rTd3zbvXQNw6nLEuKAHl107RB1fJCSEqhQU5PZbB5lKBR5XG4QCHeDx+KCjawg0BisR
+ pN2PzMxsQMfItG3yWNtdGIa9sa7ds7TOMdUlRT7F+RlQWVXIVVFhLSsqyoOKimKoqiqHsrISqKkpBam0
+ /0nq6xuDl9dYGOLpKzM1MvvF1MQqxcSEcPFN5T0zs3OsWCY70tEm0k3LSIKo8PsQFuYPBQXZ/Z9PIRJB
+ wBMCX6ALfKE2tDY1BMtk0qeOjkPBxMQG9PUN0qdP9zj/pvIOAIAQIj56lLK5oKBApaAgE1JSYkCDx/+g
+ o02kX1VTCdUVZVBVVQpdXR391i0U6sLQoX7g7OZTZqRnesDGxhEoFMpVExNC3pssw9vivWkAbt+OdQkP
+ D1gdERU8orqqVL+oMKdfXxwqlQZ6esZgYe0IMgJ2sbm+wd/TzRvs7YeAtZ0jcHVYqdrsd7MWjBCil5TA
+ rJaWNkJmZgokJsaQ9PRMvq+oLBYkp8ZDZloclJTkQleXuF96hUJ9cHAYAqPHzGhwdfe6w2Vxr5hbUB6+
+ aj4TMjqcAMPWQlfX8KT4SINbt89DSkocFBdnQ38+9mQyFbT1DMHS3A4sLB3aszKSvjI2s2px8/ACeyuX
+ SDs7Vv9b8dckKUc0Mj89TS8u6SnERYUBm83yQwRsXnpqAhTkZ0BnZ/+GkAKBLtjZuYGf31QYMsQnjMPh
+ phMw+MrCkjaoZz4HdQOQnCyiPnsWxq2vrz169ephw9raKvOyskKQyXrv4RKJJCCRKKCrayj29PaVWJk7
+ lkWEP17pPXKiZOS4GdkulvTqgS7fv6mtQU6VNZ0qj4PuAp2AzZCAdFlqSiItOjKAkJ+fAd3d3X3+2goE
+ uuDsOgwmT5xfYm5uu4zN1oiws1Pt1+ctOavbpEssup2blWJ16+opiIkJgdLSwj7dSyQSgUQig5aWToeX
+ tx/iaAkfxsaG/zluzAzwGzmt292DO+iW1EqKkdb9wHvmqmoaPzbUVTilJydARLg/qaAgkyIWi0Eq7duk
+ v6YmHxxc3GHGtMVg6+R5k0FhLFFlMNtNTbHXm4R4SwzKBqCjAzEDAhI0mppafr9378yQJ08e6zY21kJ3
+ d+82ZDJVgclUlZib21SOmzQHqDTGtxgRhfoNn9FtY00tH+iy9QWEkEpatlizvaV5b0NL05CstCRBRPh9
+ iI0Nh7q6Gmhvb+tVB4FAAC0tXRg2bFTd3LkfV6mqacw3tjBtlLZ3t5iZU5R+lfz9M/ihoUGOzS21D+7e
+ OQtlZaV9qgAMhgqoq7PB1MyuYajnqJrCwpwPHZ3d630nzGpxtmS82oTHO6a6BfHq6iSM6JAg6Ors9Onq
+ avvhwYPLkJaWKBCJWkkiUVuvDTFGwECDzYVRoyejKZMXlRgYGN3W0hb+KiVAtZku1r9u3Vtm0DUAFRVI
+ 9dmz+O3x8RHLL106wSgqyiJ0d/duM00uH4wMzcDMzC7B03N4rL//rc8Xf7wBpox36niTY/l3SXk5ojV2
+ Ak/c0X5CKu5iZGalwbOoYIvExCh2bm4a1NRU9KqDTCaDqakNTJg4V+Q3bgbS5uvexRiUdZb6WO3L1xYX
+ I/1Ll07rNzfXH75167Jebm4ioy+NLkdTC7R4gk4TE8vESdMWgibfYEdbXWXoggUjRQNtw9cBIUT098+k
+ nz79O4waNeXXsLBAu6Cg+2oSSZd1bW0FSCTKG0UikQS6ugYwc+YSyYjRUzv5uoZbnSzpf2HY4OkNDJoG
+ ACEEUVEVM2/ePOWZmhq/ITT0UZ/WkLW0hODs6gXG5nbRY0dNzRBq6WzKzEpo+OCDEQNdpDdCfGYnkDAM
+ SIBBTl4WmBuZrigrK/W6fPkoo7g0Z1JKUhyppqb3jg2VSoXhw8fDjFkrwNZpyDkjc/ZGLSZWAwDQ2IB4
+ BQUNo2Oehi4OCLg16tGjq9DZ2fuIgccTgrW1E/B0dG5NmzA34fr1Uz/MmLMcjC1dwNWaMtCme6PcvBkD
+ /v53wMTExjg3N317bPwTp4b6OqvCguxe76VSKODi7gVz5q2W2tsM2eQ9THvv21ipeRUGRQOQnd09PyEh
+ 1jEy8sH6x49vEnNz03u9R8DXAZ8RE8DCyiHdxXXoFRcP2yt8FpY10GV5V9S1In52emVx/LNISmRkAISF
+ +UNlZVGv9xnom8OU6fNh+PAJF91dnFZRqQBP4zMPhIY+mHfn1nnIzEwGhJS/m1yeAIb5jAOepuDWyOGT
+ ns6e7fYHhmH9n0J/jzl+4fHQJ/73fJsb6j/JyEgU5OVl9nqPrq4R+PlNk1g5Om/ZuOaDXwa6DAAD3ABE
+ RFQDk8NanBIXsfvCuUOaoaH3ep19VVNTg+HDJ6FRY2fUGxuafWHrYp2hx8WevW5eknOk0FxXgRXkZEJ2
+ dhYUF2dBaWku/PT7qUkSSffc6rIaaKqv/nsM3gq1teWAYYTnzicyGZBIJOBweMBgsEBdnQ18vh5oaQmq
+ a2oqNu/du6VbT88YTE0twNDQEgwMrGD4cL3X8grKzOhkEEmkCWQykVRaWjYjKytl+oMHl7GAgDsgEjUp
+ vZdOZ8DQob4wavychxw1Fty7d2VcYNAtELUq9yOiUBgwYsQY5ObuG21q5/LX2PFuYVw69kbmVRBCcOFC
+ EJaTkwq5uXlQUlIC1dUlsO3nA+pUEvnXhtpKek1tDbQ3N0N9Qw0QCM9tTyAQACEELC4XVBnqoMHSABZL
+ LfOTT2bs4HD4oK+vD1paemBsbA7Gxjago2MM48ebvzE36tu3Y31v3DhtJRKJfgkKukttbKxTWqcoFArY
+ 2Ll2jhk9487kyfMfAplwWpWtiWyMB6YqDkiqCCEsM7NTJS8vd2p0TNCeG9dPaObkpCld1mMwGODkNAwm
+ T1/cpaNjsNrVwyPeVBdLet28BAZmqEREBGOuw8ZMl3S2rSzOz4G8/DwoK8uF8vJCkMokukQSSdjS3ALd
+ 4q7/m43///MSCBB67iDyj8caiUQCBoMJRCJJVl9fHy8UCmTa2gZgaGgCenqmoKNjUnLzwbkVhgZWEi83
+ Xxg92lj0Ol3C8nLE7+wE/YLSwn1pidFWN26cZcbHh0N7u+IhOIYBGBlbAolEgrzcTKWTfBQKFRwch8Do
+ 0dOLaVTK4tmzVhabWxD6tiSg+B0gPHmSx4yICIawsIegp2fIcnR0P1lYmK1aWFgI5eXlUFNTDg0NFRS+
+ wNBRKu2E7u5ukEqee1hiGPz9vjx/hUlkMhAJz1cfpNLujpqa6hQ2mwc6OjrA5WqDgYEx6OtbAJvNu3vy
+ 5K4/R44cB/buI9HMCY69z6j2Xhbszz8vOz9LjBhXXVn+7dOoEHJrazMAKH6fjYwsYNy4mXXTZ3+Uz+Fr
+ f21vRg4ZiP0dA9IAZOXJvAtzM8+cOvU729//hlpjo+IJYiKJCPp6FjBrzqLO0WNmVXA1uDvtbJmnMezV
+ NmMghJj+/hlaAQE3IC8vgzV06OhzGRnJrKysTLXSsnzVdlELSP5+yf5x530V55z/y//fDQKRSAIymQwk
+ IgnoTCZia/ErHe2HIntLZ2htb/6irbXhqbfX+K7Jkx1f+YuaX4E0RXUthjV1tacfB9zk3b15jpObm97n
+ JayeeSeCgYEZjBkzo378lA9qOBqc+R6uWomvbAwACAjI0g4IeEjlcFTcaDTm7uTkeEhJeQrZ2SlEMpnC
+ l0ol0N0tAalUClKp5JU9DDGMAAQC4W/bP28YSCQyYBipQyAQNjg5uYOhuV1zRFjAh4Ymps1Tx82BCRPs
+ qzEMe+WJy/CkSlpTbfOX4cH3Fty6cV6vsCCdpGwCm8Fgwthxs+DDxeuqzc2sZlubU9+5J+E7bwCSklt8
+ UjISr5w5/gcvJOSO0peTo6kFI0aMhVnzVnaZG1nsZqqzdqpRQKwl7P+sfnRUlcfVa0epdDpjgkwGq1NT
+ n0JcXDjW2NhAk0plz334++Bf8KYgEIh/+7YTgaPFFTs5eEoN9c0Kw8LurR01aoZszpzlMGQIN7a/LyRC
+ CPKLgN7c3u6XmZJ44NbNE8KQ4PtQX9c/twe2hiZY2zg1zZ75UZKn56i9NJa6v7UJoaO/Pu8IIWZycovr
+ 1aun4PHjywRv73H7cnNzDVNSIok1NZWU5z0q2TvdofmP3QkEAqiosjvtnd2Qq4MHEInY/qampvuzZq3o
+ GjnS4JV8FSqaEOn21fsUKoP+V8DD60vCnzyEsjLFnSUCgQieniNh4cJPayzsHGd7u+uEvjNDwDtuAEJC
+ SkbFxoecOnv6T+3UVMVOd0QiCezshsDMOctgxPBx19gsdjKZRN5hYkrsV3pFRcgxKirC6d798wxNnvaP
+ yQlRqpmZKVBTUwnPncgHFxiGAY+nBRYWjjBkiA8gBL9ZWTnEL1069pXcerMyu2Y0iBrG+9+/NeXu7fOc
+ hMSoXif4CAQMbGxcYOKkea0uniO+mj7Bcf+rlufSpdB5KSkJzgQCtjEm5glkZMRDVVX5O21o+wqGAWho
+ 8MDc3Bbs7d1bq6rKtkyYML/d03NEgpUVud+9nqJqRKsoa9hx+8pJm4iIR2NiY8NBrGSTlIGhGXyw4JPy
+ EcOnfyfQ10uwMSb8tyIU3bqVOm7Dhh8LdQ2MEDwfHMkVFTV19MGC1ejo0Qc3U1PbP6uvQ8z+ppWS0qh3
+ /Pi9XcuXfxU3YcI8ZGxsgTASSWm6g00IBAwZGJghX9/JYi+vcXsPHrm362lq3ehXsX1KSmv8mjXbEJFI
+ VJomg6GCps5YiLZ9t293cnLLwldKK1k0+tT5wF2jx0zbO3bsdLGJiTUikSgDbs/+CIZhSF/fBI0ZMwMt
+ Xrwh7q+/ru2Kja3SexV7ZGcj4ZUrkTdXrNiEOByu0nR5PAFat34HCg4viU8vQC6vkl5/ees9gIf307Gy
+ imK/qKiAQ/fuXTSora2SnxEMA4HQEBYtXYPGjJ5+y9FO/1OWOlbW13Tu3Ekk8vnaO3Nykk2vXDnOKy+v
+ GJqXlwbNza++4+6f7i6JRAIanS5j0FWRmpo6kMkkYDDUgEgk/G1CGUilAO3tzdDVJYb2dhG0tjaCWNxF
+ 7O6WwPOJwufj2FcZz2po8MDQyAyMjC3zx42ZkaKvr7e1vV2WOWmSjdJ+c2xGI+Hc8b9InV2dTx/du+pQ
+ UpwrN/3nPQ9tNO/D1bJhw8d8N2Oi4y4M67vHWlBkPhE6McuqquLvAwPv2GVkJRsX5GWAomfdi+UBw+D/
+ bE8kEqU0Gh2YTBbQ6QxgMJ4LkUiF55GcyCCViqG9vQW6uyXQ0tIM7e3tmFgsIjyfR5C+lu3V1NTByMgC
+ OBzNyPHjF2bJZGi9kZFhh6Ojq8zIqG+Tdm1tSCctrfLPwCcPJp8+8RsxPy9bYS9IRUUV5sxdAbPmfZKi
+ a2i4iKVJSNJRe3vV9K02AKUIYbcP3hweExV09s6d89otLU1yryORSODi4gUff7y52cHRNUJHqLFMi4/1
+ 6e1BCJF/+eWMCoGAfZOaGrsmJiaYUlFRCm1tfY+RgWEYkMkUIJHJQKfRQaCnD/pCk2ZdXX2ZlpYOcAW6
+ kJGZtCHo0c1kLS0h0GhU0NDgAZlMAoQIgGES6O7GoLGxEkQiETQ2NgKdTmUuWvTZ6fr6Oo3q6mIoLs6H
+ 7Ox0rKm5htXZ0Y5JJBIQi8W9dsn/DYOhAtraemBsbJ0/Y8ZH+TKQLB4xfkKzmTbWw2OquhqREzNzNlw4
+ vX/ezetnzFtbmujydBKJRLC0dpR6DR97cviIaftnT3XK7uuaflkDYoQFhbEQBqduXj5lnJGeaFxSUtjv
+ yD8UChVIJDLQaHSkqqrebGFhj7T1jUDIF3RHRQQuTU2NK9fQEPwdaFUd2GwNIJOZgFA3YBgNurvboaGh
+ Bjo7O6G6ugrGjp1hb2Xl8HtlbRXU15ZCYWku5GRnQWVJPkUmQ8x/4jT0Z96BwWACh8MHoVA/dcmS9VIb
+ G6czVlbaf2lo9M2rr6wM8XNLyrQLC3KPXDj9l1No6D3oFstvY+l0BkybvhDmL16XZWRkOsPSmJTRL4P2
+ g7faAOz4+ZDPs9jIK/73r/MUefXRaAzwGz8dlixcl2RmYj1ThUmv1TfsPcJNSQkySkvLpuTmJoxOS0v6
+ 5s6di+qNjTUUcR+DURAIRFBjqYOqihpwONxOPT2zIgdXL7C2tAMOT9CYnBjzIZVIaDMysgChoTnYW1Dq
+ ++tSnJEh0SwqKiAUFqZBWloCZGenEZd+tOFoTkGqcXpSHKSmJnFE7S3clpYGELW19HlsTKFQgcvlw5hx
+ M2q9fcc9Jkpkny5YMKYRACA5V0LGZJhhSW7mxDt3zu24cvUovamxXq4eJlMVPIeOkU6e9OFZtjZ7zYfT
+ ffo04YgQYoSFlepV1hdviQoLHHPvzkVuRUVpn7wHAZ67JzOYqsBkqIJAqAcGBqbllhYOrYaGFvknTvz2
+ sZWVg9TcxhHMTc3RxHEOdf1dHkMIETMzpZzCskKoKMuClMw4ePo0GkZ7+bkymeq/JqbFQkxkCNYt7jAR
+ d3US29paoK/vDYVCBU1NLfDzm9ZhbGy22dLS7vHMmV45fc1bbhHSL8zLuXXm3AGHm1dPgEgk3/eCTKbA
+ mDHTYfWab3KNLaynmBlgvXsavQJvrQH4bteREclPwy7evXdFS1FLx2JpwNy5y2Hu3I9i9fQN5hobkQv6
+ ojstrXNYeXnRxeDg+7w7d84R8vLSSH3xWQcAYLM5INQxAEsLe2Bz+VFDnIa2Ghmax54589cPnsPHg4uj
+ G2hw1cBQ++1s2ohPaCbHpYRjcZFPYMqUxRPLqouWF+ZluxcWZrDS05OgtDgfFPWUXoZMJoOllb3MQN/0
+ jLW166X16zeEdWGgXpBTmnnu1D7mlctHSS2t8nWpqqohW7shURu//j1DjcH6dPQIvT7tf5VKEf3mzegt
+ 6enJX9y+fZqUnp5IkBciXR7q6hzgcgXQLekIcfXwFft4jAVrxyFAplG/S42Njrezc0NDh2q9NT/5piaE
+ 3b0bQo589gTKK0pIo8dM3ZsSG6GXmZGkJWpvcygpLoCGhpo+6Xq+RGoiGTdudjuXK1g1c+bSbGtrWlxf
+ 7s0vkBpVVlRcunnrouvZs39ATbX8lV8SiQQTJs6FJR9/mWFqaT3P2ghLedM2eSsNwLFjD/xu379w3P/B
+ NZ2uLvnvFV+gA4uXbIQpk+ZE8fmCjwwN++bGGxycPTwu8emJxw9uGIaG3u9jqCcM9PQMwdFpKBgamWeZ
+ mFsHDfUYKdXlq+3U5GEDvi04O6d7ZbtEYv3s6RNuVVnh7MSEp5CQGAklRX2LKUGjMcDdfQSYmJj9OnXq
+ 0pZHj658e/r0XnKrAs8+DocHHyxYCbZ2DtbLl07rc/cyJqb6w6tXj9unpSV+HhZ2Hzo6+hbvT1vHEBwd
+ PYHJUHtkY+OU6ukxapvvKMNB4zocnVxrlRofvyo3M8W3pCTbIikpFnJzM0Am691/AsNIMHToSPDzm1Fo
+ ZWW3dOZMjyd9STM/T2ZR21S35sa1UyOvXjtuWZgnf08BiUSG8RPmwco1XyVbmVos0zfA+tTIDBjHjz8c
+ P2/eJ4UqKmoKZzv19U3RF1//khX5rPLTgnxk3Re9hQXI7viZwD+mTFuQ29tKwj9CIlGQs/NQtH79DnTk
+ yO26+w/TPiuqRt4DbSNFIDFSyy9Ca4Ijim+fOOOPNmz4Ebm7j0SkPq5gGBmZookT5yENDb7CawQCPfTt
+ t3+iiJjKQ2UNiNP353p//apVX3VYWNj1eTbd3sEDfbLmW/TjL6eir9+O/7StFekOtI2VUVWFvMPCCj9d
+ vWb7lvVf/Ng1zGcMotOZfSorj6eNRo+elvvrrxf+SEhosetrmgnxLcN27jqRZW3jhP4e6vQQKpWG5s1d
+ gR76ZydkFL6b1YF+k5WFsBs3oscsW/ZFkbq6psLlFWNjS7TrlzMF/mEFQ/qiNztbzIuPb7z2yy/nkod5
+ jUUUKr3XJRwqlYrc3LzR998flty7l9yZlNS8uqICeQ20jfpKZhHSLSpD4xITWqbcvZtUvP37g92e3mMQ
+ jUZT+JL0RbR1DWQLP9pwOyAgd5yoFbF7y0damhRLTGyau3v36Qeurt4tDEYvlQHDEJlMRnZOnpIt3+4R
+ 37jxrDj0aeWUqmZkOdA27S8JmU2jjp9+9P1PPx0XD/Xxk9IZjF5tTyZTkKPjULR1677EK1fCLZOSmsl9
+ SevZ07ohBw/eLrCxcVaYBo1GRx8t+wIFR5SmpeXL7FPz0aDYyAcAz5dXQkNLR3z55Z5KTU2h4i+/sRn6
+ dc+p4ujoSqe+6M3OlmoGBuYEr1u3A2lr6/f6gtNodOTq6oO2bj8guReQVROX0rqjvBxZIoRIA22jV6Wi
+ HBknJrVMCwjMrv7++4PtQ4YMR3S6Sr8rP5+vI/v4440P/zh2g9eXdBFChIsXo6d/8cUvtaam1ohAIPRi
+ eyaysXdDX36zp/33P66uCosssqqqQsYDbb/XASHEiI2ts7r1KPXUjz8fr/UcOgoxmaq92prL5aPp0xcV
+ PnyY5p+W2qTZl7QSE5udDh++U2xr66KwEWAw1NAXm35B0fF1WekFiD/Q9gEAgLo6REhMbBq+d+/FGgMD
+ UwVGwZCZuRXa/euZgqioCue+6A0OLhecP/8kcMaMhTI6naHU4BQqDVlYOqLPPtuB/AOyM58lt5zJLUMa
+ WaWIOtD2eRMghAglxUgjKanp04CAnOTPNv3UZWvn3OeGQCjURytWbHn8085jvX71AQDS8pDZl1/umTFz
+ 5tIWVVU1pbpJJBLS1zeTzZjxUer9+0nJiYmNn77PDa486tsRIzisWPD4ScGj9et/yHN28UCMXhoCGo2O
+ Ro2ajA4fuRV47UGqoC/pJKa3OR86dr/AwcFdYYOrocFB3/1wqDM8onzkmyjba3cjupoR5dKtgKxduzYZ
+ ZmQkyb3GyNAcPvrk62zfsTOW6POYMQKB4mWdmhrEKSioHvrw4Y1P7tw5MzYlJRZTthlHKNSDseNnwbjJ
+ cxItjCxzSATyp1IKpd7G5PUPa8jNlWmGht73TEtLhLKyfKitrYL6+ipoaemExsYakEg6AAADhBCQyVRg
+ s/nAZDFAnaUBukJd0Na2AhMTs5rVq6fGvImHVVyMCE1NIgKGyXZkZiZZ/v77DnZRUbpXVZXi/UN8vjZM
+ nbr4oYWFw4L162fV95ZGSqpoWFxS9PmjB37Wfvo0hKhsrVwg0AUvrzEwfPjUCwih5e7ubl08Hlemq/v6
+ wS5in7XYpGTHGGWnJ0JRQQFUVBRCc3MTNDc3Q2NjFXR3d73gqMVmawGNxgQtLS1gszmgp2cJVlYOYG/v
+ gjw9BYFvIl5BSo6EKBOJzApKcn86d+GIdcLTJyZFRYpXADEMA1MzezR+0qxHkybPPWRuaxSpw8YUPoP6
+ boTV5kvcQ0Pvndy//0fzlBT58326hkaw5cs91R4+4+fbW1CCXqdMr90A7Np7euHtq2f+iIkOUZe3ji0Q
+ 6sL8D1dn+I2a/Ymfn5HSk2+bGpF6dk7tnuDge0uOH98NyoIskMlk8PIaA76+k3NHDB93RyDUOWNo+HrL
+ JNcfpozITol1ikuMhPTEOGAymfa6ukYLamoqoaWlAUSiNmhvb4OuLgl0dIhAJvv/KxAEAgnodBWg0MhA
+ o9FBTUUN1NR4QKGQCqOjQ/br6RmDg4MbuLi4gZ2da/348Y6nXtf2a9ZscUxMfJoQGRko93eBQAc8PHzv
+ WFrarfjxx429OlaFheWPiI4OO3ru3H7j1FTFk80UCgUcnb3A1XXY4zmzlsZbW+v9rKHxeoeSBAVlLU5I
+ iOWkpDyFpKQoMDa2mYMI4FpfWwlNDY3Q2tYInZ2d0NnZBR0dbS/M0BMIBKDTVYBEooCKChNoNAaoq3OB
+ y+WDUKgLhYXpe1VVWWX29p7g7OwFNja2gQYGWPLr5Nc/PN83IyXhoP+DK6bBQQ+gs1OxC4WergEsWLwO
+ Ro2bfdLaUfgZj441KdP97FmZl3/Qg0Mnj++xys/ruTiGYRi4uXvD55t3l9laOqwwN6cMzAGmDx5kLZnz
+ wccNNJr8iTk1NU20Zu3W7DsBGZ696aqtRszop5VnN331G+LxtHuZcRWiJUvWNf7xx8W1eXmvN6t/4oS/
+ YOvW/Qc8PHwPu7h557gO8UYGRmaIxdJ4rQm3fwuBQEJqamxkaGiOhgzxQiNHThS5uHgf27Zt3+Hz50OG
+ v0q+P/hgrbqPz4TLqqrqctNksTjI23v89U2bftHpi75bj9NGbvxiR46BgYnSsrBYXDRy5MTYrd//tTwx
+ p9PgVe2eldVtFRpaePjHHw8fHjFi4jE/v6miIUOGIxMTK8RmcxCGvTnffjU1NWRgYIKcnT3R+PGz0KxZ
+ S55u3vzj4bt3Uw5nZHRsQ+jVJtRySpH3iVMP1q77dFujrq6h0jyw2Zpo1dpvUHBI7tmyst73t4TFlnt+
+ u3VfNp8vvy4QiUQ0fdpCdP9+xhs7/6FfpKS0Lfjqq9/qNDk8hWOgqVMXFpw65e/am67MIsQIjam48NnG
+ H5G6hqaSikRAxibWYg+P0WuvX4/qtVF5GYQQ4fT5YJq7lx/tjz8u/zR9+tIgPl/7qZGRJVJX13hjL1xf
+ RE1NHRkbWyJDQ8u8SZPmBx05cvvGTz8d0/z118u9zhxfuBCh+sUXu27yePInXCkUGpozZ7nk5s34db3p
+ Skvrwq5ejfRat35bvkCoo9T2+vrmaN2675N37DjU71n9hnpEeuSfzYyKrzt28dKToOXLN6WMHDkJmZpa
+ ITZb853anslUQYaGpsjDYwRaufJL8cGDt4MDA/PWHjx4n1ZQgGj93TMQ/bRk6r5DN5vs7YeIlW24UlVR
+ Q0uXfo6Cg/MvpKV1MHrTe+dOuuuKFV+VK1p9YTLV0LJlX1aGhZUuaWxAhP4+k1fG37+UvmXL77/Z2bkq
+ aJ1IaOTIiUWfffa9Y2+66mqR6pOosvNLl22QqqmpKzQelUpFI0ZNFK3ftHPNtm3H+rS88m/u38/SOnjg
+ 7uTvfzyca+vonsvjaXeqqqr3Orv9tgXDMKSqykICgS5ychpWsGLFNydHjZoouPs4RaBoMu3w4QeXbG1d
+ ZHJtTyAiP78Z3devxx4tLu59qe/IkXvuH320sYzNVtwAUihUNGLEeHTixOP0+/dTTPtqc4QQVlCO+EFP
+ CgQPH6X/8Pvvl/LGT5gj0dMzQsqe9bsUGo2OtLX1kaurd8tXX/2RGxiYkxETU+FWUov6NHv/TzmfJjUZ
+ /fTT8TWTpywUKfMdYDBU0OzZy6T376edr6hAqsr0NiNECgoviZg77+NaMpksV5+BgTn666/rjbm5XR+W
+ laJ+14tX4s8/b0wZO3Z2p6LKM8TNBy1YtNanNz3ljYgTHVN5euXKzRIVFcWzqiyWOpozZ2nLyVMP1z+O
+ yu3zDHNDAxLExFS4bNjw3fBvvvmryNFxqEhFRRURiYNzazCRSEJ0OkNib+/SvH3H/ua9+y8tDw7Osv93
+ mbZs+U3fzW14EpVKk/9CGJp1/vTzyRMpKR203uxz6UaMx4oVm8uVOW2pqrLQiBETiq9ffxqRmdnZ58oP
+ APAsoWnco8Cc2p27TjYP9R4rVmdxet2SPFBCIBAQjcZATk7u6Jtvf2+9cTch3t8/262qCvVpBh8AIDOz
+ i3Tp5tP1y5ZvbOFyFTtj0Wh0NHfucklgYM7pykqkcFm2oApBUlaXyuavfh7uN2aa3I8VhmHI02sUun03
+ QZSfJ7PvPZevyccff6E6bJjvXhaLJbdwhoam6LsfD0UHR5caKdNTWIX4odEVxz/7fKdMWReQy+Wj9et/
+ aL1zJ/Wzu3fj+zRWy61C6ilZ3bPv3k2+uX37X1IPj+FSOp2OAN7MmP5dCIPBQG5uPrJNm3bWf/fdXxMB
+ AOLjqkyXL/88RFNTS76teNpo286jpUfOPOq1e3n/fqbXxi9/LubxFL+obLYmmjNnae6vvx4f6e+fRaip
+ QX16RwoKkNvJkwGLtm7dVz98+HjEYKi9V7YnkcjI2dkTffHFLumlSxE3kzPaZxc3IPW+lN0/vAALDy/7
+ 7Jutf7Xq6hooTENFRRUtX/657M6duBW96UzIkhjtO3Q72tZGUY+biJYs2SALCMjZVFGB6L3pe2UCA9No
+ 27fv/9PIyEpuRjgcLTRv3qqwixfCLXrTFRSW6/ft9j+RpiZPoZGEQgP05Td7O2Pj6tb1NY8IIWb006rD
+ e/ddRr4jp/TZlXOwCoPBQK6uXlXTZi7d8ueBK0EuLkPlXkehUNDKtd9KI2Jrt5fUKu8KxsSUjPz66715
+ AoGuwnR5WgK0eNnGvFOnAkb11fbZpcgqPKZ8y+7dpzOnTPkQqar27jQzmIVCoaFhQ/3Qz7tPo5DQosNI
+ 0vfgNPHpbet+/vVkp4mJlUL9bLYGGj168t2QkPyvmhsQS5m+8LB8i7XrvwvTEsifp+HzhWjfvqvtUVFl
+ Wn3NY78oKkKUgIDsg+PHz5abARqNjuzs3MLXrt3V6wTRiRMBwpUrtzwSCBRPOukZmqJdu0+JY+LrVvc1
+ j9euxdD27bty4sMPVyNlut9H0dM3Qda2zohCocr93dd3suzMxaAtXb044SQltY787bczOaamil9MLR4f
+ fbHpl6KLt5/59NX2aWkdZhcvR0UvWrwe6en1ba/G+yKamnw0deoi9Ouf52+mpLZuKy1FfbJJfHrb6j/2
+ XxMr2z/B4wnRtm1/oqi4mnM5pcobmJ/3nbMc6jUuXJE3opubr/jSpagDiYmtb34u4NKlcPbmzb+UyRsv
+ YhiGrGycpLv/vHhQmY6MDAk8eVLA27PnbIi5ubUCo2DI0NAU/bL7ZFdCUuNKhFCvgQATEzvIQUH5OzZt
+ +jna2tpJRiKRB/yleZdiYmqNTpx41JGX12GvzE5FRWKXc+dCCp2dvRQucQqFOuiLr3eX373f+9ItAEBd
+ HaLFxtZc//77Q6murj7ov2p7DCMgMwtb9NVXv3feu5e6Iygwp9dKhhAiJqe3rjx48EaXhYWdQpsLBDpo
+ z96L6Fly87nUAuWz+WfOPD7o4TFKKk8XlUpHq1dvkyQkNLxyHEeFnD375LKlpX23vAKw1DndH3302b0H
+ ITlKd5chhODs2ZDHzs7DEIEg3xg6OkZo165TbampzWu6OpR3ZTsRIsUlt+odP+7/3dy5Kzs0NfkD/qK8
+ a1FTY6PPN//cEptcv7S+XrHrc2GhDNux49CHo0dPQQSC/Ik4toYW2rTpt/I791M9+vJOZGZKNTZs+N5y
+ 8eJ11f8rtldVU0fjJ8/r+O3Xs9/FxTXo9eb2jBAip6eL1uw/crvN1NxGoV5LSzt07Pjj7PT0TqVd+MTE
+ as7XX++9p6kpkFsX9fSM0PHj958VF/d9p2ev3L0bZzJlyoJEeV0PAoGIfMdOr1i+6muN3vRs337Eytvb
+ L09RN5bLFaDNX+5uTkhoXN/R0athCbGprUuPnwpoGzbMT6xomeS/LCQSCbl7jqw5fPju8vIW5T2lq1dj
+ pi1cuKZF0ReazeagRR9tLDx5MdyrL44xERFFwqNH790ZM2aaiEqlyV2S/K8KkUhETk7DxIcP32lLSKhb
+ ipDyr3ZTIyIlZHSs/3HX0WZFDkNEIhGNHDlJ+uhxRkBOmfJt09u2HdCYPfvjCgqlZ7BVMpmK5s9fI4mJ
+ qdrX2zPsM9u3HzhiZGQhN+Pa2gbdv/56+tCjR6lKT4O8H5ztvHDxhnh1dY5cPSwWC326bltbeGzthr7k
+ KTGpcdlvf1zoNDGxHvAXYqDEwNACffnt75eU2amiAmEpKa2zt367v1lDQ77tVVVZaObMJTknTjzu0waT
+ hw8ztLdu/eu6o6PbG/OWfB9FT88Q/fDDwc7o6MplfbFbXGrbhq3f729TtETIYDDRsuWbUFhUxYP09HaF
+ S64xMWWUEyfuHbZzGCJXj0Cgh7Zs+SM0I73Lpi/5UsqpU4Fenp5jEqly9uFTqRS0YcOPHWfOPOl1rXT1
+ uu2/GSuYeCISiWjOnI86HzxIWNuXPAUHF36ybds+kYGB8YC/BAMlVBodTZ/9cbH/47wpvdnr2KlHKebm
+ 9nL10Kg05OHhk7dly299qvz79l3kr1ix+ZaZmf2A22AwCI8nROvWfS+6fj/xk77Y70l01dqPP97c9nxZ
+ uqc+DoeHfv75BIqLa/xYmZ4N2/+kz5j78T4Wi91DB4ZhaPzEuejKzadf9yVPCrlwIQxbtOjTLSYmlnIz
+ 6+U1Vnb06P0vCwqQwnXnkhJkc/Vq5GVzc9ssRQ44I0ZMFO/Zc37l8/8qJj2tE4uMrFj96affNfF4ggF/
+ +AMlGIYhGxsXdO3mU6VHSWVmdmGXLz/93HvE+AZ5434ikYSMzW1LZs5a0GuwlISMDmz37pOcjz7acF9H
+ p/fYDP9LoqbGRkuXbWi6dy99dXx8ldLhU04hYj4OyquaMnUhApDvSOfkNBSdPh8am1cms80sUlwnftl1
+ 0nny5A/kDr/4Al00YtSUL3/55YTS/Cgdu3R0iHxqa6s/KSrK7fEbh6MJNBple3t75+9GRpjC4HDZORla
+ kZHBs0tK8s3lHQNmbe0MpqZ2G83MXI4q25xY3ISIjc31K+7evbDj0qXDrOen+/xvQqFQkbf3uAIhT3dd
+ bo7inbcdHe2rEhKebE1JjGHL29bLF2jDqk++qbh65YzSXZolJYjW1dl+tLqmLvj+/avjy8qKB9oEg4qW
+ lka4ef0068GDMzsaGupWJCaKFc7HyEjQpauru2LBwjUtru4+IO+otZSUWAgOuOVSVlJ5EcNAW5EuZ5dh
+ 2TQaa7tQaNjjt5rqcujuEK3u6GjzeaVC3Q3Ko364cPVqE5OeY38CgYiGDRtT/+OPxyYp08HhOGBjJsz6
+ UEdf/sSHpiYfbd9+oC4urnGYMj0IIVJIZPGyjZt/buNy/3e//P+Io6N7+4oVXyqNqpSdKVP74YeDR62t
+ HeXqoNEYsiUrNqZevh5jkp6mOLBqaSliJyY2Hv3xx8PdfCWOQ7gAUldXR8uWbWy7fTt5mbLVAYQQlpff
+ MXXvHxfrdHTk1w02WwP9+tu57tjE5uGl9YonGS9ceDJp6tQP6+X1rvl8ARo1auLqgwfvK1wdUqg4Oz3e
+ WCyR/pqf3zNaqUCgD1yu7jEuV1vhPuSMDClpx44dMzta2w+VlxT1+P35GfV+Vba2Diu1tNSjlBkrPqVp
+ UdQT//3nTu1n1tb+7375AQDodCbMmLGUNHfuEqVHHmUXpE5KTUtanJHRc9s7iUSEceNmY3oCk8VzZrjn
+ WdsoXm2tq2taGBLycMn+/TtJVZWlA138QU1TUxNcu3acGRXlvz8ipnxRVQuSOzGOYRgy0KPdsbVxXzlm
+ zPQqFZWee4IaGxvgyuVjpMqq8lOi5m4VRWkKBMIHQqHhMSMj8x6/VVdXAYZRfs3MTOpfaLZnac30bTsO
+ fKurayiFl1oVMpmChrh65x079mCyMh0XLjylb926v5LJ7Bm2ikgkIVNz25LNm3+eo0xHQSUixqW1rtj7
+ 19VOQ0OTAW/hB4MM856Abt9Nulpbq3idN/RJpWDFqi2nhTp6cnXY2DiiI0fu3M/LQ0Jl9o+OqtfZtu3Q
+ dXPzvkcCxgWQlpYe2vbDgZaHwVm9rsX//PPpOQ4OniXylmepVBpas2Zb+R9/XFfq3//gQdLkMWOm58mb
+ qGezNaVr12779vHjjL7vETh8/B5/zbptbfJ2bmnxtdGSjz87p+z+mzefYocP39pkaenQJm+ZSFNTC63b
+ uONRb/kIiyglnzwTVGRp6TDgD3UwiIqKGtr2/QEUFVvtrsxuX367z3vk6Onyu6ksDvpm218o8lnFWGU6
+ CvIR/+SZgNseQ0cPeLnfR9EWGnQtX77ph+HDfXv1qfjhh2OP5LlPPz+k1Ljtu+8OfdGbjm++O3BRV89Y
+ ro4PPljR9vXXv8jd3txjCHDw4CU4d/J3wsN7l7pfjsWHYRiYmNqg6bOVrlBAWloiMSzs4YdFRTnMl4Mr
+ kMkUsLUdUubm7LlDmY7EhGZCSWXxd8eP/qaZmZnUW/n/J7C1dwFdXYM/9AW8XHm/lzciOHvtibCmtnh7
+ dJR/zwswDNw8fWUu7t5HtQ0EiYrSqayUqRcV5594cO/K5GfPQga62O8lFZXFlKdPIzbPmPHJj9HRNUon
+ 251dhu5wGzaqjEp9cQc3QggqKkqZWVnJ28PCSzcp02FqZfubQKCdQ6FQeugIDn5E0dGx3BUYWNhjXqJH
+ xkpKikiOTh5HKypKewxMVFRY4Ozkncbn629Rlhk6nflTdHSoibyz4rS1jdGHH64pmzlzRKSi+3NKEa21
+ reWHoIfXN8THhfb7ePD/InQ6EzzcfTtcXbwitXXkB5YUd0npbDWtixkpCSM6RG09fjc0NANnd69rOvp6
+ mw2UnIgUGRnOvX//os+9uxdA2t376Tg4PUEIQXp6HPnJk3sbGhvrldaXkWMtImfPXVpubd1zXre7WwxP
+ n4UwQqMfuynTsWiWV5zf6BnFDIZqj2WhxsYackpKlK9I1MR6+bceDYCpqZ1BWFiojVj88lIGBnr6pjB6
+ /CSxqy1D4TpQWGglLzj4tn1dXSX95a8/iUyGKVM+ELHZmguLigAp0tEhEi+Kfha88eGDq7SOjj6dV/mf
+ x8zUBoQCo6OabJW78n4vLUVQV9ZoHBX22CopIbrH7yQSCby9R8O0SfMbXazUGxWlk5wtNqmsqr5y8eIJ
+ Om7710MiEUNYmD/t2LFf7U+dClJXdF1lFSB1Ffa8kSMnJf8d6OXF3ytK4MalE8wTJ/wVBg85d+4JiNrb
+ luoZmNQTCC9Wa7G4E54+C9ehUKmHXr6vRwMgErX+WVNTrPvymj2RSITRoybJtHk60dnZYoXjmpSM2E/q
+ 6ut8W1p6HhFtaeMIrkO8Iu1sHGvMzOSraG5GGokxIa63bpymVlWVvdUH9L5AIpNBW0+/csgQr3htHUzu
+ YYsVFTVYU1PDoaAn9zjyzmPU1TWGsePmNZPozFRlaZUU5e69du2cQ1VVyeA5eeY9pra2ErKzE6dVV5fu
+ ys5Gcjf6GAowyA9KKWwVtSxzGeLdw+4dHe3Q0d4+OisrWaG34YcfDgctA716Fw/vMBKJ9MLYHSEE5WX5
+ xPDohyzojfHjZz9SVe0Z7UdDg9u9e/fJvYGB6QrXjJ48LbecNmfpY1U58d5oNAaaPn3J7T//vK7wRJO8
+ PKlmWFjJkeXLv1K47/1/UbT4Omj1uq2Xe3t2a9d+Gy3v2ZFIZLRo0bqG5KTmNcruj4oq9P7ww9VZ8lZu
+ cHl1IRAwNGfOcnTiROAEZfa/E5QlXLbqq9vy4iXS6Uzk6zv58c2bsUrjbRgamOsLhfrtL9/PYDDRkCHe
+ PSbeX+gB3LkTO6eyssSqvb1n18/Gfkh3+LPwX0eNslboNZL4LNyjpaHOr1XO8da2Dq7AFQqOfPrpDIXx
+ 6TvauwTp6Ukf3717vs/ntf/XwTAMTIwtYcqEeUp3+92/n7Hk6dMIQ3nPztDQDMZP/qAuMi/8gKL7MwrR
+ iKycnMOxsRHmIjnzBzivjkyGwN//JiQmRnwSGJip0LNvsq9Fhame0RF3957bMjo6RNDc1uQXFh2odC5g
+ wcJ1RHf3UYSe93dAXV2d1d69V15Yen/hwpiYaN+WlpYe3X8SiQrDvcdI1q3erPDrf/Z6KHb25H4sJann
+ gRKqqupAozKOuXp4xyq6P79Cxqqor9z96NE1VFlZ8hYfx/sFjcYAY2OLXC5X8KOia3JzZcSkpMhJNTUV
+ Wi8/OwKBAB4eo0QcrtbGicMVf4BK8gqcAvzvWBTk9/m0cJx+0NhYC6mpzybeuXNBcPlytMLhlbvHiFg1
+ NfVjXG7P0UJaShxIOsWfRUfXKjxR28rKvhIh2dcs1osuCAjJoKtLpJuQEOr777//XwPw5EkFIyj8Frmm
+ rqKHUiMjE2hqqFllYmCicFDe3FjvoGdk+ENdXc8PvI6OfoeDnUvcsvljaxTdX5SdS0p8FuoRGHgTH3v+
+ CzabAz4+E1scHdUVLtu1t7etys5O9a2oKOrxm5aWALy8Rtfw1TkRepryj+zy98+iHjn4Az087AF0SxS7
+ BeO8HtHRwUgslh5taKhVU3SNj49JjYuLV5y+vlnHy9sEOjvaobQk1zY9Pca4pkZ+/Ie5c4d2sFjsZxYW
+ PU8or6+vgejoQPKFC+H/t3mP8P9/rFzEZnLmtcmZvHNy8gBbO5dSfQOi3LcjPV1CKcrKss/JSBYg9OI7
+ RqHQoKmp9Qqfr31KmXEiw0NMb1w/C3j38/+DYQQwMbHqtrKyzc3JkShcSw4L89fIzExSkzds8vAYK5VI
+ YJGGpkqTovsLCrKGSSTir8vLiwa6yP9puro6sZCQeya5uenWZ8+GKvzQaWnpnpLIuq4wmT1dhGNingCR
+ SD7a1iZW6MU5duz0DkND0xIC4cU2orOzAzQ1tefV1VUu+udv//dSBQZcIZaV5VNfXrpjMFSAzzdIcHEZ
+ VacowfLyAgGdrrIvJye9x298vjbMmLFAtmXLJwoH9Skprd4A6HJaWqwaKF4d/J+DSCSAhYVtXXx8xCoy
+ mSj3652cLNKNj4+ykrdjU0WFBUOHjiQOGzZcJBTKP5A1Lq5aLS0tdnh8fAS9vyfi4PSfkpJ8FZGo5dCC
+ BT4Kjb1kyaiuWXNXy4TaPXf5VVWVQXx8pEpQwGOFp7YyGIyEvMKcHzR5fDn3l1IDAq79X8tAAADILUPG
+ iEjxKy0t6nGDjo4RlJYW/enoqJKuKMHTp/d1P30aSpBIei4dMpmqxa6uQ+8pM0p7e/s3cXHhel1dr32A
+ 638KCoUBjo5Dyc7Ow2SGhvI/GOXlxcPF4vbZ8jZJ2du7gb6+8Q1NTabCideoyCeC1tbWr8vL8XmXd0FX
+ Vyc8Cb2vdfpy6Fxl17k6DL2nyeMXk8k99xNFRweRVTTVF+VXyI+ZOXmyE/LyGSPT0ZHXgFQAXYXl9zSl
+ wRjg7wagtKDQWiaVTGpu7ukfoqurD76+4xRubYyLq6R6eHh/k5DwrEdOGUxVMLVyyF20yO+GssIGB9+V
+ JiREgrJjwP8XMTIy6aZQqD8KhQKFLePjxzdlOTk9J+4IBALY2bmAlpbOKYEAq5B3b3xmi4qUhH0dEKC0
+ fcZ5g8hkUqivr+YlxoYqDSPm52dyw8bWNVdFted0QX5+Jrm5vmVdWWGlwm2+wz1HYbpy4gR0dIiATKJM
+ Ki0osAb4uwFIiouVlhbnw8vdbzKZCpWVFRf5fF2F235TUlJIVVUV05qba3s0EipMVTTOb4rSWaVTp/zJ
+ V64cJ9TV1b6bJ/AeYWc3RFpWVnBTXx8Ty/u9qEhmraOjvaW4uOeWbR5PG8Ti7iMCgXaMIv0hj25TM1Pj
+ p1ZVl7y7gyVxoLGhDtISEx2Dgws/VXadr8+EbnWWRo+hgkjUBnHPQsXB/jcVDiP4AsGDNlHLRVXVnr4/
+ xYW5kBQXSSorQ899Bp8+fSSrqCjocSGHowm6enpF06cPkbsJPz2tA+h0hmZCQowMoZeWn4hEoKuplHSL
+ O1cpNUZjw9ddXR3D8O7/i2AYAUxNrYkjR45XGGw1q7BAvaS82LK+vufiiqGhOdjbu+WbmGByW9aIiCKo
+ qSzXDAm6L0UyvOf1LpFKpVBSmqsRGHhD6VmLEolklVCoW0IivfhtlclkkJwcQ9TU1NKMipQ/unNz06k0
+ MLQu0tTsOVdYUJAN+vrGf0ilYE5ISa5ndHd3WxQX5/W4kK2pBW7eYxR+HTq72kEg0D5eXlMoeLn7TiKS
+ wN15BKSmJCuN4HH37mWN2tpqBj4B9SJaWtqgrW2QYWCgp7Bl9L97E6UlJ4BM9qLtiCQSaOsY1g4d6qvQ
+ 9lVV5SRtbb2z1dVl6rjt3z2VlaUQHR2iFRNTp/AcgKKi/Eo3t9Hw8jyAVCqFuroqAV+of7ylvVVhGkOG
+ DqVwuD13AVdVlUJVVSW/vr6NSqhtrDM1NrX5uamp5/KfBpsLDnbuCsf/6emJkJmRxKguK8N6bvsldxsb
+ mz/09vZTGLTu7Nlgs8rKEvPGRoULDP+zGBqaQXLys41EIkGh70VQ0EVxUVHP8b+mphZgZLhLJlPOKrp3
+ 5syhksDAu7Surk7c72IAaG1tBgZDZVZ5ecksRdeMGOErs7CweKiiotZjGN3U1IglJMfQxo5W3Ikw0rGI
+ JxMpZS8vB8pkMigtLUCZmcmIlJqeCGXlRVjP8T8FCACZWmytx4oSWLhwFMydv1rWJurZCvH5wvZTp37d
+ WlpaqnAOoLg4z4/FYo2RSt8P5xMKmQL6huago2cAXLYA1DTYQKaQQSaWQGNjAzQ0VEN5eREUFeVCR0f7
+ a6WlrW0ADg4eSCiUXz9DgsvVrt84tvTo0Z09fmOrc2Ck1xiinZ3indQXL4bM37JlpVZ3txjeB8hkCugZ
+ mIK2tgFocXnAYnGASmNCt6QTmluaob62BqoqSyE/P/21bf+uKCzMhvv3zyscf3l66nU7O3ts1dMznFdb
+ W836dx1tbxdBXlaKXkJGxzQnK/pNefePHm180W2I73QGQ2VmW9uLH/iSklxITAwHUmpCPJQV99zdy2Sq
+ gqqqevrQoYIARRlMyGhfufWrj826Xtr3j2EYmJvbYYaGZqT9+3fKvbeoCNmfOnVgUX5+5kA/h15RVVUH
+ pyFe4Dt8POjrmebXNtVutzZzQEJ9PaAwyCAVSaGstBRychIhKioQRo2atjYzM9ktMjIIOjpaXilNoVAf
+ rKxcFP6emhOv3tHd8VFX14vuFUQiCWQyyNTRMTykTH9paenCrq4Onkwmg8EMjUYHJxdvMDGzjHC0d6sU
+ Cg1aVRiMYD5fH9Q1WNDWIYKKikrIyU6DrNQE2ty5y36JjAzSiI4Ogqam+tfPwFukuDgHRoyYsDQxsTXK
+ 0VE1Wd41H3ywipSWFo8lJMTAvzvZYnEnNDXV6na3t89JSmq96eCgKjcNhyGehMLiLHi5ASgoyYF2SQdG
+ io+PRE1NPbvgdDoTrKxcCA8e9NyE1taKiBcvPaLfu3HGNzcrldvzK4KBtbULuLgMA0UNQGF5qXZVXaVL
+ XZ3CuBQDDpFIAisrB/jgg5VdWtp661ydhqXwebQWLg9LV3ZfSkrns+rq4kuxSVEWV84fZKSmJoC8kOiK
+ UGWpQ05h2i51dfV4RddERwSg0pK8bgB4YYBIpVJBIBBUTZrkHKMsjZCQR+LW1lYYrBAIRDAxsYR585a3
+ u7mNyGJwNBf7DOGL2kXQzVTBFNbsvDyUaGxu4zpq7Mw/Lp3fT01KjILu7sHZwxSJRNDS0uSSn5+pDQBy
+ GwAPdx8kk0mATKa8sEEOIQQpSU/hwd3zvqNGTf+koQEd1dDAevQmzIwtMRqtZzjA2qoy0ubPd50maWkJ
+ dLKyEnv0M2k0BpiZWfTwN0YIkUKeFC4qKs7ZdvLEHo68PfskEg2EQgPk7j5U4VufHPdUVlZUAC+7Dg8W
+ VFXVYeSoyV1Ll22oNNAx2mVnp3Ycw7A+1WI7O1puVTUax+XzjGwtHK+cv3BQ9/ats33umvI0hUAh0HKt
+ rSnNiq7JzI2Dpoae9YBCpYG5rQshNFThyA1u3EjRWLNmIqO9/dV6J28bCoUGvmOmwkdL1pca6OnP1tPj
+ F/B4WE1f7jUxwRIQQilp6e2YjbXdL5cuHla9ce00NDc39OX2d05RUQ7ExAQqrASaQm0BR1NAUFVVh/r6
+ Fz+WNbVVcODAT5o1NVW/eHv7dafmSAJsTIkl/z5rwFDfsIZMoovhpQ9Fa0sr1ixqtoOffznb8XcUkhfE
+ 0NCy9datpy/E7UMIwYXzoUvWfLq1k8PjKTwXDsMw5Orq2bZk6WdTMzPEcs8nmz59ySh7e/cB36stT2g0
+ OvLwGNl5527KT2nZXYy62t6PKJcHQghScyQeTyJL8z9ZuRn1dZ+9m5sP2rr1z+W9qOerqam3vnyvJpeP
+ duw6/kTZjWfOPNnl6OgpGWg7K7L9vPmfoICAnPzcPKnHq65QVFUgYkZm55pnz2rC1q79vpPD4Q142eSJ
+ rq4RsrNzGyWvDEnZbY7X7yXmjR4/S4YRCAp1kMk0NHnygq4bdxLq0jI7Xwj2+vPPx+hcrk7SyydDEYlE
+ tHnzLgSff/krejn6L5FIRFwu/4V9vWmp7WN37DixYdq0BZ2qqqq9FoxAICBPz9Ho/MWQjJxS9MIe5sxM
+ qfqaNdt2q6trDPgDeFkoFDqaOnVhu6oqaycoO6qoH6TkSnxCwoqyPvroMySvsX1ZRo6chA4evK2wAbh1
+ K460YcOPK4hEaufL9+rrm6Ar1+MjleXnyy93/W6q4JzGgRQymYpmzv4IPQ7MzMrPk/m8Cdvn5iIsKrpi
+ 5/qNP0iYar2/t+9aKBQ6mv3Byt1B0WXqL+Zb5nbmQkDGaL+pSF507peFSCQiby8/dPjwrdr4+MaJ/+hx
+ dPUiWtu5JpDJL54kTCAQ0bJlnyNYtuzLHufFk0gkNHLkpKrk5OYF/yj648CVcJ/hE/tVOAKBgHyGj0Fn
+ L4Sk5ubK/u/8uZiYKqvt2/8alEdK+/nNRP7B+bUIoTcajDQvV+oTEpKfPXbsHKTojMR/ZOrUhejhQ8Xh
+ n06fDmRs3bqv/OU48BhGQFbWjvWPnhQsUpaXKVMW/87n6w24rV9+V4YNG4vu30/NLshHb6Ty/wNCiHg/
+ MOf76bM/6gYiYcDL+rKsWr9Vdul2jNX/f1dknqdOBaZ6efkhAqF/+bWwsEM7dhyriIoqnvq3OmzE6GkJ
+ VBq9h72nTl2CCM8nANELBsMwDAyNTLQQiTzVPyx30sefbL6266cvzMPC7vfL8DKZDCLCA+H4kV02p0/v
+ HXrr1jNCayuCgoIcVFVVMehmZszNbWH+olViLaFwS0YRvNH1MRNTYqi2tv6SRYvWFuvpKT6ohUAgQH5+
+ 5h01NTWFg/jC8kIor6nofnn+hEgkgDpLvXHscCOl5zaUlOTBYAv4qakphHnzPio2M7NcYmSMhb5J3RiG
+ Sa2NTE98OG9lt5PD0IEuag9qK8u6C7PTUBtCkF0sdYuMCz169PgvNpGRQdDfVZqsrBQ4cGCH4ODhXX/d
+ 8U+7lpDR4anJ5UuIhJ6j2KamKiBUVJTCy8MsAoEIDKY6iKUS6ZcbPnJ49OD6jIrSYi56yeOsL0ilUoiI
+ CIQbN06tbm5uiqmq6rIvLMxCdXWD64gvIpEIY8dOAzNTy/V25rTj1obYG2+gzMxIUcaWNmUTJswDIlG+
+ fxWZTIaKivysoUMNCxXpqSwtgvqaSnh5fIxhRBAKTbHVq79T6D4cEVFNqampog6mBoBAIMKoUZPAwdW7
+ zNSUFPX6GntCoUGVsZn5xvETZwGDrvL6Ct8g9bVVUJCTJqsq7bKPfxZ97vihn61iooJA9oou2hUVRXDj
+ 2hntC6f+nFFalHvO0szK6uVrEEJQW1sNhJaWepDXAxC1NsMfu76alJgQ/kVpSV5f05aLRCKBnJwMncOH
+ d7vGxT29SqHQ1OvrB9fmHwMDc3B0HFqjK+QnYRj2VpzjU/KkwGTQFnh5jU7S1TWS25qSSFRgs7WVTjpW
+ VxZCQ11FjxUUAgEDLS0e6OrqKLxXIuma5+zsvmgwxVzU0OAhL69xSXS66oKMov5/ZPqCUIh1stVUkhxs
+ 3WrMzO1eX+EbpKGhCbO1G+b0LOrpjX2/f2MSGR742jtjRaI2uH71JPy1d5tBVUUlU9E1pKamxh4/dHeL
+ 4d69S9DcXE9DCNF6Ta0PSCQSiIkJArFYpKWra+DZ1tY4aFxQMYwAzs4eoKOj/xOBAE/fVjp2JkQAgML9
+ +68ucnf3iS0qyunxpaZQqKCuzlOqp7y8DNraWnvsAcAwDFRU2MBicRXeW1NTyhCLOxkvN/oDib2Dc3dB
+ UeqilSsnF76+NiUgeGpkZPiTh4fX72lpz+Dl+BUDhUjUTK6vrz59/vIBcmxMWL+7/Yro7u6GoMDboKYW
+ AS8f0oMQQFtbGxA6Otp6DAGkUinU1FTAy15mr4tMJoPExKdq6enJvxUV5ZNfX+ObQU1NHbhc7RR9fbME
+ oRB7644Jvr5jJUOGDKdQKD0dNIhEAjAYJKX3t7e3QGdnG/SsxBgwGAxQVVVVeG91fTW0dw4mV1kCOLl4
+ w6gx09/6nJCeHibjcLgJPJ52CofDe32Fb4jy8kLYv/978rOokDdW+f9BJpNBU1OtnOEEArG4DQiNjbXw
+ Lr8GUqkUcnLSoba26vWVvSHYHC6IkTTA1JQQ9i7SU1NTqerq6jyopdUzZBOZTAF1dU2l99fUlENjY62c
+ OQAMVFXZSnsQtbXl0NkxeOIuslgaYGZmB5aWFu8kPX19LIxMpgUMpgagvb0d6uqq4V3vyhSJREAY7L7g
+ 7wIVpipYWdi9krPPqyAUYg3x8ZHXNTV7NgAEAgGoVOWdo9bWLmhv7+7Rc8MwDJgsNVDlsBXe29bUBOI3
+ 3LN7HTgcLrDU1IH8zqwPYGvnRFRV7fXk7v88UqkU8EgwAECj0oDP5b++on5gYGBCVlGR11VHgED5BBCG
+ SeH5POWLLQCJRAKQikEm7lByLwYYNmimX4DBoAERAxC/w3gwfF0TYKoOrpWAgQJvAADgucMf5bW1vAlk
+ ACBGvVXQf3yoXkQqlQJCZMCAqvhOmeyddzWVgWEYEMkkIL1L83eLgTCIJkEHErwBgOeRWmtry99pmnV1
+ 1XLPQCAAAcgEqtJ7Ozo6upGcWkwkEgBIAEjJHKJYLAapdPAM+zo7u6FTLIF36RVWW1M26ByhBgq8AQAA
+ kagVsrLS3mlgvJzslG55O9QoVApwuMrHp38duzOHRmf2CBcrQwioFCqFTlW8ctvZ0QZS6eAJAlJfXwlt
+ jXVAeIdZys5OlzY3Nw100QcFhN5mnN8lNBod9PQMgUJ5t93xhoZaIJGw0Tk5Uu93kV58Rgt/6Ihxn1ZV
+ 9txKzVJlg52ls/IxQLd0DY1K13j5zww6rVPU1fwzg81U+EGtaaqFjq5OGCw0NTVAcUk+FJeUvJNuSVER
+ 8u7sbBv98tbatw2JSAQDAzOg09/oFpPXQkVFHQgqKqxBMylEpzNgxuxlsnkL1kpUVNReX+FLYBgGBELP
+ Tk9LSyM0NtbZVVZWOpWXobfaK6qpQZAYE86vqSybLGp/cQhAJJKgvqEhis3WPKxMR1F+Xre8UF4aGlrd
+ P25Ze8XOmK7Qw6W5sXFQrQLIZDKIS4okdUslv1dWItXX16ichoZmu/LySrva2p4NAIFAeCt1gUylyibO
+ WNC1aMl6maqq+tsuYh/BgEajAoHJHDwtEkIIKsoKHy+Yv3rbilVfdwmEem+uuBgGdnYuMGbMDCCTX+wi
+ y2QyiE0Ig5KKnK9kMnB7xST6RFeXTIWlqnE8KiKoxxieRqODQCCsmT9/RI4yHUVFaUheA6CjYwLjJy5Q
+ 2H1KKxRTujo61dpaB1cgkKT4Z4TSiiK3epHorTa+1dWIEhZ2n5mYGAGSlw5BJRAI4OTk0WJt7dqtaJ/G
+ q8DjCST2di7HLWwc7RpaGkNkMDjmXzAMQEVFDQhstha8oW3vr41YLIb0tPQO3xGGP384b8WuzZt+7TCz
+ sIfXb5QJYGJiLV258tuE8RNmlWjxBT2uKMjNhOT4GF5FdYNDQeWbcX+WR1FRhVVUVJBxYWFOj1KxWGzw
+ 85uq1AkgMDDDICsrXaVLTjeez9cDU1Mbhfd2ikRD3Tx9trW0NMJgoqa6DB7evYRlJ2eYv810Gho63Fpa
+ WralpfWMtMbR1AKMSNq2Zs1XR+wd3aRvoidgbGwpGzly8hk9HYNPf966LicrLbltMPW+GAxVIGhp8d9A
+ BXsziMVdQCJ160ZH19ioq6tv9/Ud/+v27/d3jxgxAeSdkdYXMAyDIUN8YObMj06wWGxXRCL/YmhsKSdt
+ Mfj734T84uzfOsWyt+IUkJ3dPay2tuLSo0fXWC/HCCQQCMDj8pudnYdHKNNRW1u5FSFweLkHQCAQwNjY
+ lOLg4KLwaeakpJBqKysG3SGgUqkEoqOC2I1N9ZeSc7o930YaeXmIGhLi7xsQcIve2toz0pq+oQmMmTBd
+ wuVqfTpz3soTzkO8X7lekMlU8Bg6Cj5csPaUi4v3qhs3z3cCAJSU58kGzyYsDDQ0uEDicrkwWHoAEkk3
+ qKpyXBsaahZ7emp9hhDaSiK5NK9Y+ZWtQMd40d2bZ6GltX9fLw+PETBnzrKDEyfO+szYmCxLTm7FSgqz
+ IT42DNpfWoZLSYmFyxcOk9XoqksRQt+96V2BVVUlm65ePWaYm5vWYy2eSqWBg4t70bRpjj8r0xEZGQLN
+ zXU9HpiqqjqQydTTBgZmCvv3MXGRUFJW9CaL9MYoKyuGq1ePGeroG5/My5MtNzEhvLGYAJWViJqdXfRN
+ XFzYNzExwT1+p9MZoMnmxro7ecVOnOgki0pp+pRMIUnodPrKyLDHPTZdKUNFhQWTJ8+HsZNmH/Ya7bPB
+ UBPrAgAICsocuW7dhxbiQXICFoYBaGpyAD7/fGefQg69K7GyckQ7dx759d+Z7UBI9fGTwv2bvvoV8fn6
+ fdJDJJLRsGFj0M6dx/ZFRlb83+RScTGyOHc17LGTq6fc+5hMNbR2zXeSqKiKnYW50jfSMmZnd/uEhxed
+ XLRoXbGKCktOuhiysHBCV2/EJIdGFiscgCYltUycO3d1Lo3G7KHD3t5VNmrUBEdl+RjpN3m0iZn1gD9j
+ RUKhUNGiRZ+iwJD8rNRc6RuLCnT48G3Wpk2/NHA4XLnpmpvboq1b/3zhnYtKaVb9Y//1fX5+M3qN4PSP
+ aGpqo3XrvkePHmXu7+5AL8xinz4dsNfFxWfAbfyPEAhEtHjxBgQ//XSqo68FfBciFOqhOXOW7s3Jkb1Q
+ ERq7kPqzuNoDf/xxWWRhYStVFiqJSCQiP78p3UeP3t0XEVHKevmFSE5t3fnNt/ukampsufdraHDRp+u2
+ dwZHlv9UVIReedciQgiycyQeMbHV+Rs3/YzYbPmBKclkCvrss51NERFlw4sK5bsB1tUh4vHjj37w8hor
+ V8ecOR93Hjx401VRXlLzO3S///loPI02+OLi/VuYTCZa9vFmFBRcmJ+WJnrloKAAAFWViJyQ0PDTypXf
+ RHI4Wl3y0lNVVUMTJsyMuno12ujl+/NzEOvkycf7/PymSEgkxXUEwwjIwsIW7dlzQRIdXXGgpQWp/1tP
+ QQEirV//w15jY4sBt+8/QiQS0Rdf/ILAz2/GeBqN1j3QGfr/GSOhxYs/a0pIaJr38gOpqUaqUVFlBocP
+ 33jg5TWm++VAh/+Iq+sIdO5c6OWCAoncZaWCfKTx+HH25REjJytsSNTVOeijZV90Xr4cueNZUoMuQqhf
+ U8P55YiXktnp/jAgu2Tlqq8QS11+Y4NhGBo/fg4KCspJLy+XKXRQLyjoHLtz59EGDY2eXzE1NQ4aMsR3
+ 7c2b8QpdCG/djjNfv+GHQfOclQmTqYI+WLgS3XuQXJKa2uReUIH6tXUPIUSKS2/TvXsvaceGDT928vm6
+ CtLCkIvLcOnVqzEnFenKze1QPXTo3n4Pj9EdL8fOhL8r0pAhI2QnTz0qi01pOVJf33MpMzOza96GDTua
+ GIy+RYV+F0IkkmQ//XS0Cuzs3O309U3FA52hf4uv72R04MDNpYoeSlJqI+fuo6QKF5dhcivUyJET0MOH
+ 6UrX0kMjSpm7/rhwxdDIXGGloFAoyN3dW/zngWutN+4krMjPR069vXzVrUiYW4A8A8NK4g8cvC3y8hqL
+ SCSywrKaW9ihQ4fvpGVmii3r6uR//RsakMrlyxFbxo6dKTcUu5vbcPTZZzs/UJavDz9cbTR8+IROGATP
+ t08vKImEXFy80W97zooeh+TFZ2dLPdtFSAi9UFiJnB4FZq04eOJeq+/oiWImg6kwDYG2Hvrq69+vPnqU
+ rXRn0IkL4Vb29m7J8j44BgYmkuPnQh5Ex9Vx0guR3Ab41t24pZOnzh9wm/5baAw1saW1iwfJxt4NK8jP
+ gOLi3N5s+84oLMyCyoqiofl56IGxCdYjcABHXb1N3CG+7+Lmsywu7sVJc4QQpKTEw/37l80zM7utLS3J
+ ck/x8RmmK7py/emqZR9/OXbfH9+qyjvgRCwWQ0xMGDk3N4vs4zP+UK7n8Iavvv5tk5Wla6eZtTVoqLOB
+ IMNAhiGob2mEouwsuHcjYFZrU+OU8DB/CAm5Dw0N1X/bvCdCoS5MmDwvUcfEfAmFQs7U1JQ/5dDY0GZU
+ W1vxfVxcmNzJQy0tYcrIkWML9+z5Wu79oaH5lIcPr49//PjGO9x02zscDg8wjAB1dT1jQ0glEoiLC4Oc
+ nHSGj4+fk7fPuEg2h3P73LmAqyYm9hI3N+51DMMkHQjpZKa2+mTnpEJWRiLt5tUrvyTGhmoEBd2FiopS
+ hWmrq7NlDq7uVxo6apePHWuuNEBC3NOQdfWNdXbyfC+cnLyk+Rkpn8yeP7xeVc6yQXEt4t+8dmNoYdHg
+ qV8AANo6OsDiqLeTnJw9QCrpgpiogNfX+oYoKSmAto72paXVFRcBoMfboauLdYUlVa/jagnFAoHeqsrK
+ khd+r6urhtzcDJ/k5OiJAKDwGC83ryEibQPDI51doo2HD+yEmpoKudfV19fAjRunIDDktoaZic2x1JR4
+ 4PEFwOPxgUKiQZe4C2rqK6C+ugbKyvIhPz8LmpsblZaRy9WBSZPmxznZeayY6GuerOi6iiakmvA08+P7
+ 969gdXU9D8fR0zMGHk/n+sSJTtGKdERFBVM6Ozu2NzTUvjkPlzeAu/sIcPPwhaNHdkFpSb7ca1pa6uHu
+ 3YsQ/OQeGBlZTNHXNZrC4fBh1aqYP62tnZvmTF9kz9fSnlJdUwbVFaWQnZ0Oz4PcKIbF4sCiRWsxtyFD
+ v/tg/mil56MdOnTX4+iRXa7VlT0bEzU1NnC5WsednNybVBWsGTbVNNk01dYuzc9ReprcO8dI3wqsrV0A
+ Hj7Mtt+wYafcCZKBFO/hE9DGzb/6phcp3id2+MRdl3kffiL3fAEWi42WfLwx6W5g5pC8PKRQRztC9LCn
+ VT/v+OmozMDApF95pFCoiE5nIjKZ2q/79PWN0IYNOxLPnw91UPaQLpxNgas3w7S/3fZnh4qKWs9uHI2O
+ nJ2Hhf/xxzWF3j+JiS2E+/dTf3V29uhQdJLTQAiNxkC+vpMfRT6rmbf9uz8TLS0dEIb1PQY+k8lELJYG
+ 6u+4WiDQRZu/3iMLCSv6ua4OsZTZPzy80nXTpl2pWlpCubrGj58t27r1L4UnuFY0Itj7+3nfSZPmDbi9
+ X5bFiz8THz36yJ7AZnNzs7PTv1RRUYfBRHrqM9AScH/r6uxUGOLWyt4jS1WV852xcY+ox9Dc3AiRYY/t
+ S3OzzonFXQ6KxtcMDOuwttPaMX7crN1fbtkrcXYdBmRy3yb+xeIu6OgQQXd335w7yGQK2DsMgzWffZ8x
+ 2m/iB/Pn+yQpu97MUpdVXdF46PS5/eS2tp7L+zyeUDp69PSMdetmpinS0S4V0zMzU8YVFubSBpMDEJut
+ AWpqqllDh/Aujhk97YONn/+U4eE1qs8OXyKRCJqbG6C9vW/hzUgkMlhY2MmmTFlwYajXaI8hXvo7NDUx
+ hWcv/nT8Onbp8hGLkJCHNtXVPXuGAoEu0BnM71xdvbIU6ZBIZNqqHN5vycnPBtrcL0AgEEBfX6/DwcFe
+ RnJ312ifPHlOlp6ePmRkNA103v6PhoY6iI2KtOpolSqsjV7Omm0PH2bndbWLoKgou0co5dycDLh757yp
+ ibHFNQ7HwhUA5PbLOXSsrbYafSfzGEHia+lMu3XjuMGjRzexmprKV47N/m+IRBLw+UJwcxtdM3/+J5W6
+ hkazhzhxlPr7V5QjTmZW3qmHDy5MKCvK69F4Uak00Nc3TjUwMP1SmR4Skbg3Nu6JaUtLMwwm1NQ0wMHB
+ m3zz5nnw8NTNzMzsmKara3D7zu2LFnfvXoTy8sJ+naisCAzDgMPhgZOzR/HU2R/F0AmMlZPH2fa6GYLZ
+ jUblF2fsSUjo6ZhJIBDB2t6t0Xf87IRJk+zltkBVlYiQGJdukvAs3LqsrHCgzf0CPJ42JCQ8XTt//oos
+ EgDAMO/xZHG3FDIykl9X9xsDIQQR4Y+Qqgrd5cyZ+6ULF06Q+zYY6BvWeI8cWxaXEK6Tnhr/kg4ZBATc
+ Aj5fh9/cPN8VAPwVpcfVwtrT8tGXBkbm3y1fu+2Ak5OXZUDAPafU1GiorCx5pQjJdDoDeDxt0Nc3rp0w
+ 4YN0Bwf377V4/GgHRzWl+3HzK5GguLjmr+vXT49/8uQBJpMTI57LFXTNnftxzCefTFI62RAXFaQe+yyM
+ /PLml4EFAyKR1GBmZp79z18sLek5WVld05ct++wvZ2dPo0f+1w3i4yKgsqK0z1/5f0MmUYAv1AZLa2fw
+ dBsZTqPT5phb2tX7eur3GnkgKKhg9P375y9FhDzQkNcIGRiYgp7Q8BBPS/uBIh3tHWKKqKP9VGDATdJg
+ i7upb2gKegZm9WZm9OcvxbUHyXZjJ86LlrfOOZBCJBLR1KnzK2bNWkBXVqCEhObJn27YUaLGkr/WrqbG
+ QuvW/VB953bq+L4aqbgY6UZHVxzZvHnXsZkzFxeMHDkJWVraIw0NLlJsJwxpaGgiS0t75O09HtnaOl74
+ 4otfjoWGli7oa7q55UgQ/rTyyqYvf0UabPmeayoqqmjVqq1VP/xwXOlWzjt3MlxHjZoeT6czB/xZ/lso
+ FBoyNLRQWHmys7r8niU2Hdv23YFjDg6eF4aPmISsbJyRpqZAyVl5GGKzNZGpqQ3y9hmPJk6ZX7B63TfH
+ AiOLj+SUIt2+2j8stmzitu37qrW0dOSmQ6XS0arVW1DU04ofFenILEJYVELD3DUbvmtS5kA0UDLng+Xo
+ 0vWwyQAAJACAmePtU0yMbc6rqbHdn58VODiQSmUQHh6ounbt9tUjhs/4bdXqqXIHsU5OrDuHTvlLHRzc
+ D0ZHBem+vFzT0tIMFy7u51GZjCNRUdWrPT21bveWtr4+VgoAywEAMjLEfqmpcQ6hofchMjIAbGycHPUM
+ zee2i1oBSaWAkcjApNGgq6srKScn6aKn52gYOnRi1wcfeB7AMKx79+5NfSpvVgniNtY2//Uk8M70E8d+
+ gQa5s9kY+PiMl/n6TvzTyspZ/O23HynUFxPzeFZFRaHTYAt/xWAwwNXFAysslD98Nreg+sPfvTWEEPna
+ jYSnYVGPqNGhQTB69MR5ZDLDoa2jDZCkGzCMAAyGChQUZF1qbW1MdHEZDj4jx4Oti0uSsyXLf/8fO/qT
+ NXh878qGC2f286qrey4LEwgEGDrUFyZOmp+myuE/VKTD0gBDt+4mbA5+fJP1uif8vGmoVDp0tXfdNdI1
+ fnFZ4qOPPltvYWE34K3Ty0Kl0dDw0ZNS5i9c3esS1oULoRHOzkORotluHT0DtH79tpKwqLIbyTndQyor
+ X21SrKUZaT0Ozp52/lL4tDNngqeduxo1LSAgY1pubofDqz6YzCIZO/xp5d1t2/9E2tqKT+61t3dHX375
+ 2+ZLl8IU2qO6EmG3b8eOnjhxdnZfjiN/1yLU1pf9/teVe69ip5ycdoeAgPxp565GTztzJnja+fNPpj1+
+ nDatrQ1pvartE+PasfCI/MkrVmy6oaHBrZbXy8AwDJlb2KMjJx9lFhQgZ0W6UnIlhNjYuk0rVmxppFAG
+ n+11dY3RqFEz1vTI+PmrEStHjJrcOZiWigAAAYYhrpZAtHz5F3vDwwsUDgWKihAkJTXb7959Kl+Lp6tQ
+ H5fLQ+s3/IjCwkpz8/NlDq/60rxJcvMQKziy9P6GjTsQm81RmHcdXQO0Z89ZUXJyk8Klp5wyRMjOFfv8
+ +ee1Ml1d04F/fi8JgUBEZma2ReeuRPTqVfkuQAhh167Fjdu46edKXX0jBCD//VdX10Cbvvk9Pyi6SunB
+ gsnZ4tWnzgS1GhlZKtQ1kOLpORrt2XNpQ4+MPworYLi4+pxUVWUNeCZ7vjQE5OMzVnz2bODm3h7ovXsJ
+ tp9/sTNPg8NTqI9KZaJZs5ahO3fiClNS6u3f1csmj+CgPO7FyxF3Z81eLmMyFW/U4Wjy0GebdzaGPi1Z
+ WFeneINSdgnSfhycXTlx4mw06Brzv7+kzs7u3QcO3Ll17Vqs4kMM3wFpaR0Gm7f8Nm7egk/qFe3VAACk
+ osJC85esydt//LatMn3V1YgVGJR/eOq0JWiwzacBPJ9TmzVraWNERMUiuQVYt+HHIwYGZgOeUXmiocFD
+ fn4zL+7Zc0rpxpDiYgSnLoU7LfvkywwOR0upMZycPNCOHYdyz50LHV9djUzfzWv3HIQQ6/T54DGfrt9+
+ 3cF1qIyoZLKIw+GhT1Z9WfcwJPujjFKpwrBZbW2IFBdXPXfTpp1dNNrg637+IwQCAVlaOsuWLNlw/dCh
+ a2O6u5U75LwNTp0KdP7998s57u6jxMom6tTVNdD06Usyftx5yunKfaWxWiAtrWXujz8elWhq8gfcxvJE
+ S0sbzZq15FB8fLN8l/BTV8LmWNs4lwym+AD/FmNjC/Tll7+dDQ2tEkAvHDl8323x4g3JPJ5AqU42m4c+
+ +GA12rv30pOIiPLVTU3orR4RhBCCqKiqpVu/PXhg3vzVSFNL+cuiqclF69fvaHz4IGtpb7ozMpqpx449
+ rDA0HJyN+Muirs5G06cvQhs2/HAgMCBv6btwVAqIKrX49LMfVk+cOC+9t9gSbDYHzZixIPnnn4/0Gicy
+ KaFdc/fus2dsbZ0H3K6KxMXFG507F3pEaUFG+k1/JD9oxeAQb+8xaO3arcP68rDPnXvitnLtt6l8gU6v
+ ek1MrNFHH21Ev/127rq/f/ZbOTguNLb0o127zx5etOhTqbm5A+ptjMjjCdAXX/zUGhxcuLAv+o8du7vZ
+ 1dWndTCOPZWJoaE5mjF7mfSbb38/HBqaq3hZ43Vs/6SW8/PPZ3/zGzs91M7BDZF6iYHBYvHQ/PmrUvft
+ O99r5a9oRqy7jzMuTp48b1AOuwAAUak05Oc3PSshoWmE0sL8uOfsAy2BrmygM6xIyGQS8vDwfrJw4ape
+ t4YCAFy5l+D4/Q+Hs6ysHJGyICIAz2MRmJhYIUMjq7CPV296cP580LejR00n//jLcXJKQUe/ogNFRFSS
+ du48Qh41ahr50KFbE1et2vpghO+kBktLB0QiKe9hYRgBmZtZSXb+crItOLT4g97SyszsJj5+nP3VrFkf
+ iygUyoA/o1cSAoZMTCzR0KGjG+bPX/fg+vVnD4KC8px/+GE/OTS0jFxejvq0kxEhBM+e1ZF37TpNHjdu
+ Nvn69bhvN2788YGlvVOYpaUjYjCYvdgeQ4aG5mjz5l+yjhy5rzTCUlpaO+TliVVinlZe/XT9d4hOZwy8
+ HRWIJpePNmze8ejlMvR4qffsv2pyZN+OgNzcNIPBtob5D2pq6uDnNzfK0dFxxpYtK3o9ZzwqptY2Oy/t
+ 1unjvxvFRAVAZy9x2UgkCrDU1UFVhdUuEOgXuXp6g7i7c11w8N1kSxNbEAqMgMvlApfLBYmECESSDCrr
+ 66C5pgLKywuhsrIMW7Fi66GUlGjzZ8/Coagok9PdLdFqaKjr1bWYRqODi4t3p6vrsO0TZyy8PXKoXg6G
+ YQpdyRrrESUjq2L91avHt548uZcp77ShwQKJRAKJRLl7L4YRQF2dAzyeNnA4nBJnZ482F5eRwOVxn/x1
+ 6MfthtqGoMbiAFsgAIKUBBhJCu1NTVBdXQ2lNSXg5jBUYGJidSom5gk1NjYMKirKDVpa6xjNzQ29nodA
+ oVDB1skDPl66scDS3Hqqj49Ram9lio6uvBgQcHvOnj1bsKam+oE2sSKjgrW1q/SX3SduThhnM+uFn16+
+ dvfPx8g19bWZ+/fvMG5vH1wOJP+Gw+HB7NlLIoYNGz93/nyfXg/2S84R25YVFZy8cuGgMPTJA0FJST70
+ xUWTTKYAmUwGGZK1cnha3boCA9DQ4AOLxQIWiwVSKQEIRBk0traAqKkB6uuroaqqDJqaWtXF4nZCd7cY
+ 5O0jfxkMw0BLSyhxc/PNnDjxw0t8vs6vkyZZKb0RIUSJT2hc++DBpR2HDu6kVVSU9ZrOQEGj0cHAwKS4
+ vb1DWFZWRJbJevfzJ5FIQCZTgUajgYYmT8Lm8Fq0OFrAZKqCClsDMBkRMKIUukQiaGpqgtqmWqipKCO2
+ i5pZLS0t0B/bC4W64O4+vHL+kg0VJibmS+wsGL1W/idPcnVCQh4/OHZst215efFAm1ghFAoVZsz7KG/G
+ lMXuM6cPUd5KxcU1kS9cCD9uamo1qKIEyROh0Ei2adOuoHt3k4x7M0JdB4KYhEbSk6c1E7778fhtD4+R
+ 9ZqaWv1KD8MwhGEYIhAICuWfa/qjV0ODi0aNmoQ2bvzh4OrV31IePMjt9YAMhBAhPb11w959lyV6huYD
+ /ix6EycnD7R06YbZO3Yc/WPSpA8Rjyfst463YXsVFRaytx9S/8UXP99+9Ch7QsSzKlJrHyYjo6LqjH/5
+ 5XSQubnNoB0u/yN8vh46eza0IDy8TPmps//w229nNVes+LLtfZhMMjW1Qpu+2uP/OLKo10bg31y6FLrE
+ z2/6fm/vCRIWiz0geWeps9Eov6lo9uwVN27ejNmOEOrTXtjMrK65CWmtO/b+cVFibm4z4M+gNyGTqWjk
+ yMlPjh17ZI0QIvr7Z29fsuSzG+MnzEGavazSvC1hMFSQj894tHHjT817917p18RjbGyr8U8/nfK3tXVD
+ g7+OYGjGjGWdkZFl31VU9DGuZVxcNf2bb/Z8q6WlLR34AvQuRiZWaNWarSExMVV/lJf1fU0ZIYSdOxfx
+ 5c6dR2UTJsz9O+T423+g2to6aNKkD9CqNVtDDh27v7y2pn9urImJTTE/7TqF9PUHn6efPDEwMENTpy5c
+ 9+8yNDcirfOXI5dv2LwzZPqMpUjX0BgB9vbzwuUK0bhxM9A32/bLTpzy356V1T2jr3YvKUasuLi6P776
+ 6rcQa2unAbdrX4TF0kCHDt1uSkysZMsrk9wWwcVFq+O77w5f9/Dw/fr27bODKpCEPAryMuDGtRPDmXT6
+ 8InTF+rkFMgWmRkRet1DimEYQgjtSU11eEoiUbERfpNXlRRmTQgNCcRKSrKora2tIJPJACEZvIoNMAwD
+ DCMAgUAAJlMN9I3Nuj3chktd3X1K21ta1viOmJ5vbUPK/6SP+rIyEbGqpmTT+fP7zc+dOwRVVaV9vHPg
+ eH4mo5v0o482Yrdunfm/v7PYWDUAHEnJ7QwKC/TXF8vErGmTFh15+jRAJSsrg9Te3kqSyaR/2//1bE+j
+ 0cDAwLzLzcMXGZmZ3cfEkgOjJsxDrvaqERiG9WmfdF4xUimpqTkR/Oj69LNnD0JZWd5Am7ZPuLgMRXQ6
+ Y6OeHl/uhJ7CLoGlpX1+bNyTjQKh3v6KQTzB8Q9VVWVw6NDPUFdfNW327OUoLK56qbeLVq+BHzAMEwNA
+ CABAYxdK9r8bxqaQVNjW1g7nY2PDVVJSnkFubiqIxWIuAJAkUgkgmQz+eTmfz6MiwDACEIlEIBCe/0sk
+ 0oBEktXoG1pK7R3dwcPFG2QE7GsCRogYNX5Uly4X61ftDQ4qoiQmRa33D77+za0bZxiN9YNn16YyhNr6
+ oKdvdMPAwPyUvN/tTGn5AJAPAHD9ekJSZWU+0c9v3tyW9uZVifFhkJudSQSQ8Dq7OkEqkYBMJgOpVAYI
+ /bOaggGGPQ/SQSASgUgkAiCQAJBqTU0twc5uCLi4DG3LzEyab23n1jhx5phGbXWs/ustK/pchry8LrXy
+ oqITV6+dmnb+3F/Q2DhIZ/tfQkVFHUaMmFxvbz8kisPB5M6GKmwAZs927zpx7nE1hUaDm9dOvVIr/K5p
+ bW2GC+cPY4WF+dNGj58hiYqq+NXDQ5CNYVhrX+5nU7F6AKgHAEhL63RubGzAKipKoLQ0F3buPLWnobHa
+ vry2FFpqa6GhoRba2hoBw6iAkAQoNBXQEmqDhiobtLR0QF9fX5ScHLM4KTWxwcjEChydPMDeXk3U3+PG
+ EEIQEVvueOXs8ZFpabE/REUFUF4lOMlAQCASwdTcumXyrPmJtra0pt6unzHDqRAAID/v1K5HwQ/+LCvN
+ Aa+h4zTsHd1OFVUWMKvLCqGhphEaGuqgo6MeEAJA6PkXnsPhAZvPBy5XC7TYvOSvv1rzmYYGF4yMLMDF
+ xQutXDnl+TuwrO/57+5GqsnJ9eYhIQ8/v3nz8rTg4DtYZ+fgXRl7GXcPH6AxqJ9paakpjD6ldFLAx2N0
+ aWVxSUpUeKDd+9DdBADo6uqEJyH3CWWlBbNlnd2zmps99iCEtmEY1t4fPTY2tBcaDT5f72MZkmKtXa0g
+ be+Ezs52kEg6AcOoAEgCFDoTVFTUQE1NHdhsDnC5WvDjj5tkGIbBg7uX4Mv+JP4vLl+NmJeTl340IPAm
+ IzsrGXsfGuJ/4PF0wGOY3zM/b7Of+nOfsQnWDQDdAAAInWgJCS0Z2dzZDB0tjSAWSaGzswMQav+7ASAC
+ nU4DJlMV1NTUQV1dAwR8HVRTU4wePy6Gx4+vwpYtvXpR9wAhxHzypGhrQkLUZ2fO7MVSU+OxwRbZRxls
+ NhfsHN1Tho+dlC0QvMYZlw8DsjbPnL1sUJ0f2FdRU9NA06YtQN999+eBxMSmvg61BwXPnjWM3bJl9/aJ
+ E+c0yzsN6H0QodAA7dlzKj88PH/sQNuzPyCEyL/8cnrPhx+uQlyu9oDb8VXEz28GunDhSa+7Z3slvwLZ
+ 7PzpRKiOjuGAF+pVxcrKAa1a/W3HkTP+r/ohfmckJDQ7XboUdnrBgtUFtrbOCHsHM+NvSwgEAjIxsUQz
+ ZiwpOHXK/3RSUsugiAGgjMuXw76YOHHuFRsbF0QgDPYlPvnC1RKi9Z/vDM3M7FYYLr5fPHtWvW/x4g3S
+ wRjhpK/CYKggM3PbtplzPo64+TAtIjqhYWR2toTxLl6q3igqRtS7D9KEt28nPFy27PMsJ6dhSFlsgPdN
+ 6HQmsrV1Q/PmfZJ18fqzh+dvxr7VHZf9ASGE7dt3mXns2N0PV6z4IsLW1rlNQ0NzwG32qkIiktCUqR9K
+ g5/k7+tL+fu0waWoCHGCwgNP7Ni2enxhQc6gOl2mv6ioqIGxqRUMG+pX5ztyYmVTU8N8OzvPShcXtXc+
+ rZ6dLWbeunWBo69vvDviaYhneMhDnfy8dJB3BsB/AQZDBfQNjcHMyjkyOy120ZzZy7qnTl1S7+io9s5n
+ 1tLSujVDQm4w8vOzjTAMjj98eINTWVnCGsx7KfqCFl9b8vnGnx5MnTJ/qakZsdflij7vcDt68iE7KS4q
+ 9eTJPdqDeY9AX8AAAzKFAnp6JuDiMrTd2Ngmpqy6cOuM6Qtg0jjHJAzD3moBb916NuTu3UtkDCNO6eho
+ XxUZ6U+vqCwhdIvF78Vqy+tCIpGQurpG+4gRE4BGUzsgkYhvT5o0t/uDD3ze6gkaCCFmYGC+w40bJ0Bb
+ 2/D7goJ0t7Cwx4TS0kK6WCwGhN6fST55UCgUGDf5gyJnRw/HrVtWNPXlnj43AFlZUkpOTsre3bs3LQsP
+ D+jb0TnvCXQ6E2wdXMHezhXqayt2k8mqacOHjwNnZ5fCIUO0w19Xf1ZWh2F4eIiXv/89yM5OYjo5ue7K
+ ykpRTU2NB5Hov/m17ys0GhOsrBzB0tK2NT4+ZrO1tYPIx2cieHv7hDs4aBa+rv6UlAavhIR4w5CQ+9De
+ 3m7D5Qq+SEmJgpSUWGhpaRro4r9RHB3dYOt3h8v09Y3NnOxVO/pyT7/2uCcmVmrFxsYXfvfdGnp5edFA
+ l/etoKamBkKhIejqGgOdzswvK8u/ZGxsCSYmFmBoaAna2sYlEyZYyo2qkp7ebVdWlju7uDgfiotzIScn
+ CwoL04FOpzszGKyxRUX5UFlZCi0t74cjybuGyWSBtrYu6OoaQ1tbyyORqDXe3NwCjIyswczMFgQCYfDE
+ iU7Biu4PCspaXlRRpleanw5ZWelQWpoP2tr6c9va2oyLi/OhtLQQWlre7y6+IjQ0+PD11j1SH98JW1XV
+ 1H6x0Mf6dKxSvxqAhgZET08vX3v+/IGfTpz4lSAW977V8v2GAGy2BqioqIGqqhowmWoAgLWlp8c9UFNT
+ BTpdDQCkAEACsbgNVFQ0jLW19Z1bW5tBJGqD1tYWEImaobm5EQZrbIXBCoYRQU2NBWpqz+2uqqoOra1N
+ uUVFOYkqKhxQUVEF7O8TeTs6OqClpR5s7ZzGI8BU2ttaoKWlGdrb26AvMRjedzAMYM6c5WjhRxu/HDfK
+ 7Lf+Opv1i7Q0RN1/+O6W4b6TB234o7ctBAIBUShkRKPREZVKQzQaHb23kXjeMyEQCIhMpiAqlY6oVPrf
+ tqcOyii870IwDEOursPQ9etRory8Lvt+Vmfo94y+jQ3WlZffnUjCUFNpcZ56fl5Gf1W898hkMhCLZfC3
+ sxrOO0Qmk4FM9l/vefYdgUAHZs79uMncznEtk0npd2XsNfCEPFSZpMeO7p6fjZ8wp0pVlTXQNsDB+Z+E
+ SqPB8FGTqhxcPD/j8GkXBIK+7Wx8Y/j7516cPWvpe+kmjAsu77MQCAQ0ZuwMdO1W/MW+1da3QHa2ePyt
+ uwmlHh6+/7PzAbjg8q4FwzBka+eGLlyOKM3J6e7ziddvhaRsse+h4w+rDN+DuHS44PJfEAFfiHbvPlWV
+ lNnp29d6+laJiq0evmPHwRotvu6AGwcXXP7Loqamjj7/fEeNv3/q8D5X0LcNQgjuPEoZserTrZXqAxRg
+ Exdc/utCpzPQggVryy9efDLiTbmMv9IqwMtgGAYaAv0nTvYei8eMnVmsoqL2RjKHg4PzHAqFCtNnLITR
+ YydvFwj0n/zjBDXo+PXXC+PHT5pbyGCqDHiLiQsu/wWhUChoytQF6Oa9pISsYjSkv3XynfPd7mN+Xt4T
+ islk6oAbDxdc3mchEolo9Ohp6Nbt+KTsEuTS/9o4QNy5kxQ5deoCpOzsdVxwwUVZ5SehEX6T0ZWr0emZ
+ mV12r1IPB4SaGgRFRcj60eP0nKnTFiAyGfeTxwWX/giZTEHu7t6Nt+7EZuTkii1frSYOMNkFEqt7gVmZ
+ c+Z/gmg0+oAbFRdc3geh05nIy2tM2ccffz4yLbWV9ar1ry/06cz1V+Wr77+rZdM0Io2NrDwxwLTy8zKg
+ S/x+xLTHwRkImCqq4O45usjJ0Wc5i6UeNO8Dn86BztNrU1CAXPz9M3ctXLKukMt7P8Ms44LL2xY2m4Om
+ z1xcuGPPyXGvU98GLbcep4765tu/ygwNzQbc2LjgMpiEz9dF69ZtLTtx4vGo16tlg5ynT2t8Dh++U+3m
+ NgIRCIQBNzwuuAykEAgEZGVt3/Xbn+cr/QMyfF6/hr0HZGd3et+8GVc1afKHiEZnDPhDwAWXgRAajYGG
+ Dh3VvGTJunlRCRX6b6Ju9ZcB8SdECGE52d0jqmorT92+c1H3yqXDUFZaOBBZ+Z9GKNQDIpEGZWU58D8Q
+ jXxQIRTqw6hR0+o8PYd/RqPRzy9ePGZAYpIPmENxQT6Crq7OMR1S6cGo6EDD0yf2QHxsBMik73ds9vcB
+ IokIzs7eMHLE2IeqqhoQHHx7XGRkIHR2vv8TzoMdDMPAzNKu02eY351581Y/bGioOjVjhvtAZ2vgSMjo
+ GJuRLd5x805s05KlG5CWUGfAu2b/ZeFyhWjR0g3ozHn/C5UVSL22Fqlfvxl7Yc2n25CursmA5++/LJqa
+ QjRr9lLJpm/3bHobdem9Jj8PTQiLKP3qj32XJe7uI3AX4jcsRCIJubh6oT1/XEJRkRVnW5oR7x/b13Yg
+ XlBYyfwffjoaMGLkBEQmkwc8v/8tISA7Ozc0adL8PdeuRs5ECL2RXbhvgkG1pxAhRM7M6FxTUJL//aNH
+ 12l3bpwmlZUX/+fjur9NiEQS8Pn6MHnyPNGIkePjza3tv9RiM/L4Aqz25WvzKpH+od936re1tB0JDrlv
+ XpCfCRIJHvn4VSEQiMDW4MgmTprb7ujidcTcyHD7uHEurQOdr38zqBoAAICKckTplIJWXXXd5wX5OSsv
+ XjxGDg29A01N+Gk6/QHDMOBweGDj6FK38INPqzTUufNdXB0rdHSwXg9Bvf8407Khqf7K5bP7+PHxkZrV
+ 1RUgk+FzM/1Bnc0BN/eRaNiIcTcZVNL6uYsWNGirv90zJ1+FQdcA/ENlBSI3NHb+JhK1DgmPCHS7e+8i
+ pCQ/hYb6moHO2qBHU1MLtHUM6idNnJXu7DJsB09LL2Koh7BPZ8UBACCEICaxid5cUzUsLi7ym1u3zlhX
+ VZVyysoKB7pogx42WxMsrOzB1XNE0tRpi7MIRMLy4W7CQfXV/zeDtgH4h6yMDhYiEH+qaaq1jgp97P3o
+ wVVITY2FhoZ3fpr3oIfD4YGNrQuMGDWpwdza6fN509xOvgm9Dx9mL7l//9KI1NToOXl5WZT/6rmQrwOH
+ wwcra3uwsnZKGT/pwzhDU8sf7EwJRQOdr94Y9A3AP+TnSk06ursPVVaX+SYmxsCTkLvwNCoE6vEeAbA1
+ ueDpPgqG+4yRCbQNfnEY4p1iY0J44/Hiz58P/iQo6KF9S0vDJ1FRAVBRUTLQRR9wOBweWFs7tInFst2L
+ P9rQ7ebjHeRopvpWjzl/k7w3DQAAQEJmpwmZRLanUAjUipKiPWlpydyIJ48IkZEPoKKi7H9nnIphQMAI
+ IBAIYejQMTLv4ePAwMD4DysL+1BDQ7iLYdhbMwRCSOXChcgxWVkJM4uLc2eHhT0glJYWgUwmgzcVqHKw
+ g2EEYLN5aNgwPxlCkq0eHsMSvv561aOBztcrlWWgM/CqFBcj6w4xcmqor9lXVJwPyQkRzJAnd0gZGanQ
+ 0d4OUmmfTkd+ryCRSECh0EDXyEw0xneqxM7ZI721vn7tpIlzwMAAcklk7J2NNWtqEO/27fs6DAZjX1J6
+ onXw42uk3LxMZkd7O3R3//fO7iORyECj0cDQyEzmNXx8q4ArPANAOfXNN0vTMQx7b/e4v7cNAABAbSki
+ tgFwZQigtq5xq6i91TchIZoSHxNqEBf7BOpqa6CtrRkkkve3MSCRyKCqpg4abC6Ym9s0DRsxtoZIoa7V
+ ZPFSRo0bJdbXwgb0wPuqaqTxJDKWUldbaieWSPbdv3MZstOTdDs6RHSRqBU6O9sH2oSvDIlEBlVVFqix
+ NEFX16h8jN8UkbOLZ2ZZddknU8ePbeHxsPe3NUCfbAAABFxJREFUcH/zXjcA/yarGJGIRCDW1jbxiQj2
+ lxRlU5KTn1kWFWbrZGUmQ2VFGdTWVoL4PQhIQqMxQFNTC7hcXbCwtAZ1ruCJt/vobgMD/SuFZfln580c
+ Jv77KLZBA0IIu/komXL+1H4YN3r2l+npT4fGxoYyxWKxZ1VVGdTVVUN7e9tAZ7NXaHQGaLA1QUtLB4RC
+ vUahUCfOy3cCqGtofN1YWZvq7e0rMzR8x4dwvkX+Mw2APHKyu6d0ITQ2OyMewkP92YChObn5GVBSVABV
+ lWVQV1cDAAM/b0ChUIDN5gKPJwBdPRNgqqilqzJZ4WPGzAQbG7tmKyvaVgzD3rt+dXY24mRmJm/z979O
+ bm1t8mppabQuKcmD6upyqKqqBJls4HtmGIYBl8sHTU0+6OgYgUjc9kBfx6Rk4vhZYG3tnGBvr3p0oPP4
+ Vss/0Bl4VyCEmPlFsDQ9L5kU+OAucDX5K9pams0ryvOhpqYCqqoqoKysEBoaGuBtNgoEAgYaGpqgpaUP
+ AoE2aGnpQElJ3lGZTJI5xHU4+PpNA3N766em2ljUQNvsTVJaijxzcnLcAgPvQElJgZaursnm0vJiqKkp
+ g6qKIigvL4WmxjqQvdWJRCKoq7NAINADPl8PeEJtUFdRr01NfbrL3t5dNnr0FBjtO+SSKgurHGh7vSv+
+ ZxqAlymrR85t9TJBbnYiZGQkQlJSPDx7FgJTpizdJpF02tfX10JTUyM0NNRAa2sjtHY0QWuTCCTdYmhv
+ lz+vQCJRgMFgApVKAiZTHRgMFrDZ6qCuzgM2mw0aGprA4Wi1BQffXsPl6rU4OrqCtbUbTJxoF0EiYU0D
+ bZN3BUKIkpEj/aKtrWVba2sTtDbXQ31dDVTVVUJNeSU0NNRCa2sDNDTUQXNzPbS2NkNbWytIJJ0gEolA
+ LO7ZGSKRSMBgsIBEwoCpqg4qqmrAVlUHtgYX1NXVgcURAI1ESr5+/eR3jo5Dwd7eE6ycXMDcwLLZwZ4Z
+ PtA2GSj+ZxsARaSndxsWFKSrFRUVQkVFGZSV5UNNTRnUNldCXWU9dHV2QGNjpdyXkEJhAJutAUwmBTQ0
+ hMBi8UFXVwhCoQno6GiDjo4hGBiYS+3smGkDXc6BJrkQ0SlSmRmZTAAaBQBkAPVtnVCcUwClJflQW1sG
+ paWFUFVVBDU11VBfXwNicSs0NDRCe3vPubfnwygBUKkYsDW1gcPlgTbvuc2FQgEIDCzA0sikxdpaDXdn
+ xMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB
+ wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB
+ wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB
+ wcHBwcHB+W/w/wDeZyycJNLgxAAAAABJRU5ErkJggg==
+
+
+
\ No newline at end of file
diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs b/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs
deleted file mode 100644
index c1b774b..0000000
--- a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs
+++ /dev/null
@@ -1,482 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using System.IO.Ports;
-
-using SDRSharp.Radio;
-using SDRSharp.Common;
-
-namespace SDRSharp.XDR
-{
- public partial class SettingsPanel : UserControl
- {
- //When SettingsPanel starts it will call this
- public void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- this.enableXdrCheckBox = new System.Windows.Forms.CheckBox();
- this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
- this.comPortsBox = new System.Windows.Forms.ComboBox();
- this.BaudrateBox = new System.Windows.Forms.ComboBox();
- this.label1 = new System.Windows.Forms.Label();
- this.label2 = new System.Windows.Forms.Label();
- this.sourceComboBox = new System.Windows.Forms.ComboBox();
- this.label3 = new System.Windows.Forms.Label();
- this.label5 = new System.Windows.Forms.Label();
- this.referenceTextBox = new System.Windows.Forms.TextBox();
- this.acquireButton = new System.Windows.Forms.Button();
- this.rebuildButton = new System.Windows.Forms.Button();
- this.resetButton = new System.Windows.Forms.Button();
- this.averageTextBox = new System.Windows.Forms.TextBox();
- this.label4 = new System.Windows.Forms.Label();
- this.label6 = new System.Windows.Forms.Label();
- this.enableCheckBox = new System.Windows.Forms.CheckBox();
- this.refreshTimer = new System.Windows.Forms.Timer(this.components);
- this.mainTableLayoutPanel.SuspendLayout();
-
- //integrationNumericUpDown
- this.integrationNumericUpDown = new NumericUpDown();
- ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).BeginInit();
- //
- // enableXdrCheckBox
- //
- this.enableXdrCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left;
- this.enableXdrCheckBox.AutoSize = true;
- this.enableXdrCheckBox.Location = new System.Drawing.Point(3, 6);
- this.enableXdrCheckBox.Name = "enableXdrCheckBox";
- this.enableXdrCheckBox.Size = new System.Drawing.Size(85, 17);
- this.enableXdrCheckBox.TabIndex = 0;
- this.enableXdrCheckBox.Text = "Enable XDR";
- this.enableXdrCheckBox.UseVisualStyleBackColor = true;
- this.enableXdrCheckBox.CheckedChanged += new System.EventHandler(this.enableXdrCheckBox_CheckedChanged);
- //
- // mainTableLayoutPanel
- //
- this.mainTableLayoutPanel.ColumnCount = 3;
- this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
- this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 54.90196F));
- this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45.09804F));
- this.mainTableLayoutPanel.Controls.Add(this.enableXdrCheckBox, 0, 0);
- this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 0, 2);
- this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 1, 2);
- this.mainTableLayoutPanel.Controls.Add(this.label1, 0, 1);
- this.mainTableLayoutPanel.Controls.Add(this.label2, 1, 1);
- this.mainTableLayoutPanel.Controls.Add(this.sourceComboBox, 1, 3);
- this.mainTableLayoutPanel.Controls.Add(this.label3, 0, 3);
- this.mainTableLayoutPanel.Controls.Add(this.label5, 0, 5);
- this.mainTableLayoutPanel.Controls.Add(this.referenceTextBox, 1, 4);
- this.mainTableLayoutPanel.Controls.Add(this.acquireButton, 2, 4);
- this.mainTableLayoutPanel.Controls.Add(this.integrationNumericUpDown, 1, 5);
- this.mainTableLayoutPanel.Controls.Add(this.rebuildButton, 2, 5);
- this.mainTableLayoutPanel.Controls.Add(this.resetButton, 1, 0);
- this.mainTableLayoutPanel.Controls.Add(this.averageTextBox, 1, 6);
- this.mainTableLayoutPanel.Controls.Add(this.label4, 0, 4);
- this.mainTableLayoutPanel.Controls.Add(this.label6, 0, 6);
- this.mainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
- this.mainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
- this.mainTableLayoutPanel.Name = "mainTableLayoutPanel";
- this.mainTableLayoutPanel.RowCount = 4;
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 17F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 8F));
- this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
- this.mainTableLayoutPanel.Size = new System.Drawing.Size(206, 217);
- this.mainTableLayoutPanel.TabIndex = 1;
- //
- // comPortsBox
- //
- this.comPortsBox.Anchor = System.Windows.Forms.AnchorStyles.Top;
- this.comPortsBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.comPortsBox.FormattingEnabled = true;
- this.comPortsBox.Location = new System.Drawing.Point(3, 50);
- this.comPortsBox.Name = "comPortsBox";
- this.comPortsBox.Size = new System.Drawing.Size(96, 21);
- this.comPortsBox.TabIndex = 2;
- this.comPortsBox.SelectedIndexChanged += new System.EventHandler(this.XdrComPortChanged_CheckedChanged);
- //
- // BaudrateBox
- //
- this.BaudrateBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.mainTableLayoutPanel.SetColumnSpan(this.BaudrateBox, 2);
- this.BaudrateBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.BaudrateBox.FormattingEnabled = true;
- this.BaudrateBox.Location = new System.Drawing.Point(105, 50);
- this.BaudrateBox.Name = "BaudrateBox";
- this.BaudrateBox.Size = new System.Drawing.Size(98, 21);
- this.BaudrateBox.TabIndex = 3;
- this.BaudrateBox.SelectedIndexChanged += new System.EventHandler(this.BaudrateBox_SelectedIndexChanged);
- //
- // label1
- //
- this.label1.Anchor = System.Windows.Forms.AnchorStyles.None;
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(24, 32);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(53, 13);
- this.label1.TabIndex = 4;
- this.label1.Text = "COM Port";
- this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- //
- // label2
- //
- this.label2.Anchor = System.Windows.Forms.AnchorStyles.None;
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(105, 32);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(50, 13);
- this.label2.TabIndex = 5;
- this.label2.Text = "Baudrate";
- this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- //
- // sourceComboBox
- //
- this.sourceComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.mainTableLayoutPanel.SetColumnSpan(this.sourceComboBox, 2);
- this.sourceComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.sourceComboBox.FormattingEnabled = true;
- this.sourceComboBox.Items.AddRange(new object[] {
- "Filtered IF",
- "Full IQ",
- "Demodulator"});
- this.sourceComboBox.Location = new System.Drawing.Point(105, 77);
- this.sourceComboBox.Name = "sourceComboBox";
- this.sourceComboBox.Size = new System.Drawing.Size(98, 21);
- this.sourceComboBox.TabIndex = 7;
- this.sourceComboBox.SelectedIndexChanged += this.sourceComboBox_SelectedIndexChanged;
- //
- // label3
- //
- this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(3, 81);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(96, 13);
- this.label3.TabIndex = 6;
- this.label3.Text = "Source";
- //
- // label5
- //
- this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label5.AutoSize = true;
- this.label5.Location = new System.Drawing.Point(3, 141);
- this.label5.Name = "label5";
- this.label5.Size = new System.Drawing.Size(96, 13);
- this.label5.TabIndex = 12;
- this.label5.Text = "Integration (sec)";
- //
- // referenceTextBox
- //
- this.referenceTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.referenceTextBox.Location = new System.Drawing.Point(105, 107);
- this.referenceTextBox.Name = "referenceTextBox";
- this.referenceTextBox.ReadOnly = true;
- this.referenceTextBox.Size = new System.Drawing.Size(51, 20);
- this.referenceTextBox.TabIndex = 11;
- this.referenceTextBox.Text = "0.00 dB";
- this.referenceTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
- //
- // acquireButton
- //
- this.acquireButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.acquireButton.Location = new System.Drawing.Point(162, 106);
- this.acquireButton.Name = "acquireButton";
- this.acquireButton.Size = new System.Drawing.Size(41, 22);
- this.acquireButton.TabIndex = 10;
- this.acquireButton.Text = "Acquire";
- this.acquireButton.UseVisualStyleBackColor = true;
- this.acquireButton.Click += this.acquireButton_Click;
- //
- // integrationNumericUpDown
- //
- this.integrationNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.integrationNumericUpDown.Location = new System.Drawing.Point(105, 138);
- NumericUpDown numericUpDown = this.integrationNumericUpDown;
- //numericUpDown.Maximum = 300;
-
- this.integrationNumericUpDown.Name = "integrationNumericUpDown";
- this.integrationNumericUpDown.Size = new System.Drawing.Size(51, 20);
- this.integrationNumericUpDown.TabIndex = 13;
- this.integrationNumericUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
- //NumericUpDown numericUpDown = this.integrationNumericUpDown;
- //int[] array = new int[4];
- //array[0] = 300;
- //numericUpDown.Maximum = new decimal(array);
-
-
- //NumericUpDown numericUpDown2 = this.integrationNumericUpDown;
- //int[] array2 = new int[4];
- //array2[0] = 1;
- //numericUpDown2.Minimum = new decimal(array2);
- //NumericUpDown numericUpDown3 = this.integrationNumericUpDown;
- //int[] array3 = new int[4];
- //array3[0] = 30;
- //numericUpDown3.Value = new decimal(array3);
- //this.integrationNumericUpDown.ValueChanged += this.integrationNumericUpDown_ValueChanged;
-
- ((ISupportInitialize)this.integrationNumericUpDown).EndInit();
-
- // rebuildButton
- //
- this.rebuildButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.rebuildButton.Location = new System.Drawing.Point(162, 138);
- this.rebuildButton.Name = "rebuildButton";
- this.rebuildButton.Size = new System.Drawing.Size(41, 20);
- this.rebuildButton.TabIndex = 17;
- this.rebuildButton.Text = "Rebuild";
- this.rebuildButton.UseVisualStyleBackColor = true;
- this.rebuildButton.Click += this.rebuildButton_Click;
- //
- // resetButton
- //
- this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.mainTableLayoutPanel.SetColumnSpan(this.resetButton, 2);
- this.resetButton.Location = new System.Drawing.Point(105, 4);
- this.resetButton.Name = "resetButton";
- this.resetButton.Size = new System.Drawing.Size(98, 22);
- this.resetButton.TabIndex = 16;
- this.resetButton.Text = "Reset";
- this.resetButton.UseVisualStyleBackColor = true;
- this.resetButton.Click += this.resetButton_Click;
- //
- // averageTextBox
- //
- this.averageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.averageTextBox.BackColor = System.Drawing.SystemColors.Control;
- this.averageTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
- this.mainTableLayoutPanel.SetColumnSpan(this.averageTextBox, 2);
- this.averageTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.averageTextBox.Location = new System.Drawing.Point(105, 177);
- this.averageTextBox.Name = "averageTextBox";
- this.averageTextBox.RightToLeft = System.Windows.Forms.RightToLeft.No;
- this.averageTextBox.Size = new System.Drawing.Size(98, 25);
- this.averageTextBox.TabIndex = 14;
- this.averageTextBox.Text = "0.00 dB";
- this.averageTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
- //
- // label4
- //
- this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label4.AutoSize = true;
- this.label4.Location = new System.Drawing.Point(3, 111);
- this.label4.Name = "label4";
- this.label4.Size = new System.Drawing.Size(96, 13);
- this.label4.TabIndex = 8;
- this.label4.Text = "Reference";
- //
- // label6
- //
- this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label6.AutoSize = true;
- this.label6.Location = new System.Drawing.Point(3, 183);
- this.label6.Name = "label6";
- this.label6.Size = new System.Drawing.Size(96, 13);
- this.label6.TabIndex = 15;
- this.label6.Text = "Power:";
- //
- // enableCheckBox
- //
- this.enableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left;
- this.enableCheckBox.AutoSize = true;
- this.enableCheckBox.Location = new System.Drawing.Point(3, 5);
- this.enableCheckBox.Name = "enableCheckBox";
- this.enableCheckBox.Size = new System.Drawing.Size(65, 17);
- this.enableCheckBox.TabIndex = 0;
- this.enableCheckBox.Text = "Enabled";
- this.enableCheckBox.UseVisualStyleBackColor = true;
- //
- // refreshTimer
- //
- this.refreshTimer.Interval = 500;
- this.refreshTimer.Tick += this.refreshTimer_Tick;
- //
- // SettingsPanel
- //
- this.Controls.Add(this.mainTableLayoutPanel);
- this.Name = "SettingsPanel";
- this.Size = new System.Drawing.Size(206, 217);
- this.mainTableLayoutPanel.ResumeLayout(false);
- this.mainTableLayoutPanel.PerformLayout();
- this.ResumeLayout(false);
-
- }
- // Comport
- public int comIndex;
- public int BaudIndex;
- public string[] myPort;
- public string[] myBaud;
- public ComboBox comPortsBox;
-
- // Plugin stuff
- private XDRPlugin _plugin;
-
- // SD# Exposes that interface
- private IContainer components;
-
- // Main Checkbox
- public CheckBox enableXdrCheckBox;
- public bool XdrEnabled;
-
- // Main Panel
- private TableLayoutPanel mainTableLayoutPanel;
-
-
-
- //Another UserControl squshed inhere
- private ISharpControl _control;
- private AmplitudeProcessor _processor;
- private float _reference;
- private TableLayoutPanel tableLayoutPanel1;
- private ComboBox sourceComboBox;
- private Label label3;
- private Button acquireButton;
- private TextBox referenceTextBox;
- private Label label5;
- private Label label6;
- public NumericUpDown integrationNumericUpDown;
- private Timer refreshTimer;
- private Button resetButton;
-
-
- private Button rebuildButton;
- private Label label1;
- private Label label2;
- public ComboBox BaudrateBox;
- private TextBox averageTextBox;
- private Label label4;
- private CheckBox enableCheckBox;
-
- public SettingsPanel(XDRPlugin plugin, AmplitudeProcessor processor, ISharpControl control)
- {
- this._plugin = plugin;
- this._processor = processor;
- this._control = control;
- //this.sourceComboBox.SelectedIndex = 0;
- this.comIndex = 0;
- this.BaudIndex = 0;
- this.XdrEnabled = false;
- this.InitializeComponent();
- this.XdrEnabled = Utils.GetBooleanSetting("enableXdr", false);
- this.enableXdrCheckBox.Enabled = true;
- this.comPortsBox.Enabled = this.XdrEnabled;
- this.BaudrateBox.Enabled = this.XdrEnabled;
- this.comPortsBox.Items.Add("None");
- this.BaudrateBox.Items.Add("None");
- this.myPort = SerialPort.GetPortNames();
- this.myBaud = new string[] { "300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200", "230400", "460800", "921600" }; //Baudrate is here
- ComboBox.ObjectCollection items = this.comPortsBox.Items;
- ComboBox.ObjectCollection Bitems = this.BaudrateBox.Items;
- object[] items2 = this.myPort;
- object[] Bitems2 = this.myBaud;
- items.AddRange(items2);
- Bitems.AddRange(Bitems2);
- this.comIndex = Utils.GetIntSetting("comIndex", 0);
- this.BaudIndex = Utils.GetIntSetting("BaudIndex", 6);
- if (this.comIndex > this.myPort.Length)
- {
- this.comIndex = 0;
- }
- if (this.BaudIndex > this.myBaud.Length)
- {
- this.BaudIndex = 6;
- }
- this.integrationNumericUpDown_ValueChanged(null, null);
- }
-
- // XDREnabled Button
- private void enableXdrCheckBox_CheckedChanged(object sender, EventArgs e)
- {
- this.comPortsBox.Enabled = (this.XdrEnabled = this.enableXdrCheckBox.Checked);
- this.BaudrateBox.Enabled = (this.XdrEnabled = this.enableXdrCheckBox.Checked);
- this._plugin.PopulateComPort();
-
- this._processor.Enabled = this.enableCheckBox.Checked;
- this.refreshTimer.Enabled = this.enableCheckBox.Checked;
- }
-
- // Comport dropdown
- private void XdrComPortChanged_CheckedChanged(object sender, EventArgs e)
- {
- Utils.SaveSetting("comIndex", this.comPortsBox.SelectedIndex);
- this.comIndex = this.comPortsBox.SelectedIndex;
- this._plugin.PopulateComPort();
- }
- // Baudrate dropdown
- private void BaudrateBox_SelectedIndexChanged(object sender, EventArgs e)
- {
- Utils.SaveSetting("BaudIndex", this.BaudrateBox.SelectedIndex);
- this.BaudIndex = this.BaudrateBox.SelectedIndex;
- this._plugin.PopulateComPort();
- }
- protected override void Dispose(bool disposing)
- {
- if (disposing && this.components != null)
- {
- this.components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- //for custom Signal Meter
-
- private void refreshTimer_Tick(object sender, EventArgs e)
- {
- //TODO
- if (this._processor.Enabled && !this.averageTextBox.Focused)
- {
- if (this._processor.Average < -500f)
- {
- this.averageTextBox.Text = "-";
- return;
- }
- this.averageTextBox.Text = (this._processor.Average - this._reference).ToString("#0.00") + " dB";
- }
- }
-
- private void acquireButton_Click(object sender, EventArgs e)
- {
- this._reference = this._processor.Average;
- this.referenceTextBox.Text = this._processor.Average.ToString("#0.00") + " dB";
- }
-
- private void sourceComboBox_SelectedIndexChanged(object sender, EventArgs e)
- {
- this._control.UnregisterStreamHook(this._processor);
- switch (this.sourceComboBox.SelectedIndex)
- {
- case 0:
- this._control.RegisterStreamHook(this._processor, ProcessorType.DecimatedAndFilteredIQ);
- break;
- case 1:
- this._control.RegisterStreamHook(this._processor, ProcessorType.RawIQ);
- break;
- case 2:
- this._control.RegisterStreamHook(this._processor, ProcessorType.DemodulatorOutput);
- break;
- }
- this.resetButton_Click(null, null);
- }
-
- private void integrationNumericUpDown_ValueChanged(object sender, EventArgs e)
- {
- this._processor.Integration = (double)this.integrationNumericUpDown.Value;
- }
-
- private void resetButton_Click(object sender, EventArgs e)
- {
- this._reference = 0f;
- this.referenceTextBox.Text = "0.00 dB";
- this._processor.Rebuild();
- }
-
- private void rebuildButton_Click(object sender, EventArgs e)
- {
- this._processor.Rebuild();
- }
- }
-}
diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs b/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs
deleted file mode 100644
index 33403e7..0000000
--- a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs
+++ /dev/null
@@ -1,249 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using SDRSharp.Common;
-using SDRSharp.Radio;
-
-namespace SDRSharp.Diagnostics
-{
- // Token: 0x02000004 RID: 4
- public class ProcessorPanel : UserControl
- {
- // Token: 0x06000011 RID: 17 RVA: 0x0000227B File Offset: 0x0000047B
- public ProcessorPanel(ISharpControl control)
- {
- this._control = control;
- this.InitializeComponent();
- this.sourceComboBox.SelectedIndex = 0;
- }
-
- // Token: 0x06000019 RID: 25 RVA: 0x0000247B File Offset: 0x0000067B
- protected override void Dispose(bool disposing)
- {
- if (disposing && this.components != null)
- {
- this.components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- // Token: 0x0600001A RID: 26 RVA: 0x0000249C File Offset: 0x0000069C
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
- this.label4 = new System.Windows.Forms.Label();
- this.enableCheckBox = new System.Windows.Forms.CheckBox();
- this.sourceComboBox = new System.Windows.Forms.ComboBox();
- this.label3 = new System.Windows.Forms.Label();
- this.label5 = new System.Windows.Forms.Label();
- this.referenceTextBox = new System.Windows.Forms.TextBox();
- this.acquireButton = new System.Windows.Forms.Button();
- this.integrationNumericUpDown = new System.Windows.Forms.NumericUpDown();
- this.rebuildButton = new System.Windows.Forms.Button();
- this.resetButton = new System.Windows.Forms.Button();
- this.refreshTimer = new System.Windows.Forms.Timer(this.components);
- this.tableLayoutPanel1.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).BeginInit();
- this.SuspendLayout();
- //
- // tableLayoutPanel1
- //
- this.tableLayoutPanel1.AutoSize = true;
- this.tableLayoutPanel1.ColumnCount = 3;
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 47.82609F));
- this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52.17391F));
- this.tableLayoutPanel1.Controls.Add(this.label4, 0, 2);
- this.tableLayoutPanel1.Controls.Add(this.enableCheckBox, 0, 0);
- this.tableLayoutPanel1.Controls.Add(this.sourceComboBox, 1, 1);
- this.tableLayoutPanel1.Controls.Add(this.label3, 0, 1);
- this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3);
- this.tableLayoutPanel1.Controls.Add(this.referenceTextBox, 1, 2);
- this.tableLayoutPanel1.Controls.Add(this.acquireButton, 2, 2);
- this.tableLayoutPanel1.Controls.Add(this.integrationNumericUpDown, 1, 3);
- this.tableLayoutPanel1.Controls.Add(this.rebuildButton, 2, 3);
- this.tableLayoutPanel1.Controls.Add(this.resetButton, 1, 0);
- this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
- this.tableLayoutPanel1.Name = "tableLayoutPanel1";
- this.tableLayoutPanel1.RowCount = 4;
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(204, 121);
- this.tableLayoutPanel1.TabIndex = 10;
- //
- // label4
- //
- this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label4.AutoSize = true;
- this.label4.Location = new System.Drawing.Point(3, 62);
- this.label4.Name = "label4";
- this.label4.Size = new System.Drawing.Size(83, 13);
- this.label4.TabIndex = 8;
- this.label4.Text = "Reference";
- //
- // enableCheckBox
- //
- this.enableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left;
- this.enableCheckBox.AutoSize = true;
- this.enableCheckBox.Location = new System.Drawing.Point(3, 5);
- this.enableCheckBox.Name = "enableCheckBox";
- this.enableCheckBox.Size = new System.Drawing.Size(65, 17);
- this.enableCheckBox.TabIndex = 0;
- this.enableCheckBox.Text = "Enabled";
- this.enableCheckBox.UseVisualStyleBackColor = true;
- //
- // sourceComboBox
- //
- this.sourceComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.tableLayoutPanel1.SetColumnSpan(this.sourceComboBox, 2);
- this.sourceComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.sourceComboBox.FormattingEnabled = true;
- this.sourceComboBox.Items.AddRange(new object[] {
- "Filtered IF",
- "Full IQ",
- "Demodulator"});
- this.sourceComboBox.Location = new System.Drawing.Point(92, 31);
- this.sourceComboBox.Name = "sourceComboBox";
- this.sourceComboBox.Size = new System.Drawing.Size(109, 21);
- this.sourceComboBox.TabIndex = 7;
- //
- // label3
- //
- this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(3, 35);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(83, 13);
- this.label3.TabIndex = 6;
- this.label3.Text = "Source";
- //
- // label5
- //
- this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.label5.AutoSize = true;
- this.label5.Location = new System.Drawing.Point(3, 95);
- this.label5.Name = "label5";
- this.label5.Size = new System.Drawing.Size(83, 13);
- this.label5.TabIndex = 12;
- this.label5.Text = "Integration (sec)";
- //
- // referenceTextBox
- //
- this.referenceTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.referenceTextBox.Location = new System.Drawing.Point(92, 59);
- this.referenceTextBox.Name = "referenceTextBox";
- this.referenceTextBox.ReadOnly = true;
- this.referenceTextBox.Size = new System.Drawing.Size(49, 20);
- this.referenceTextBox.TabIndex = 11;
- this.referenceTextBox.Text = "0.00 dB";
- this.referenceTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
- //
- // acquireButton
- //
- this.acquireButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.acquireButton.Location = new System.Drawing.Point(147, 58);
- this.acquireButton.Name = "acquireButton";
- this.acquireButton.Size = new System.Drawing.Size(54, 22);
- this.acquireButton.TabIndex = 10;
- this.acquireButton.Text = "Acquire";
- this.acquireButton.UseVisualStyleBackColor = true;
- //
- // integrationNumericUpDown
- //
- this.integrationNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.integrationNumericUpDown.Location = new System.Drawing.Point(92, 92);
- this.integrationNumericUpDown.Name = "integrationNumericUpDown";
- this.integrationNumericUpDown.Size = new System.Drawing.Size(49, 20);
- this.integrationNumericUpDown.TabIndex = 13;
- this.integrationNumericUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
- //
- // rebuildButton
- //
- this.rebuildButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.rebuildButton.Location = new System.Drawing.Point(147, 90);
- this.rebuildButton.Name = "rebuildButton";
- this.rebuildButton.Size = new System.Drawing.Size(54, 23);
- this.rebuildButton.TabIndex = 17;
- this.rebuildButton.Text = "Rebuild";
- this.rebuildButton.UseVisualStyleBackColor = true;
- //
- // resetButton
- //
- this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
- this.tableLayoutPanel1.SetColumnSpan(this.resetButton, 2);
- this.resetButton.Location = new System.Drawing.Point(92, 3);
- this.resetButton.Name = "resetButton";
- this.resetButton.Size = new System.Drawing.Size(109, 22);
- this.resetButton.TabIndex = 16;
- this.resetButton.Text = "Reset";
- this.resetButton.UseVisualStyleBackColor = true;
- //
- // refreshTimer
- //
- this.refreshTimer.Interval = 500;
- //
- // ProcessorPanel
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
- this.Controls.Add(this.tableLayoutPanel1);
- this.Name = "ProcessorPanel";
- this.Size = new System.Drawing.Size(204, 121);
- this.tableLayoutPanel1.ResumeLayout(false);
- this.tableLayoutPanel1.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- // Token: 0x0400000D RID: 13
- private float _reference;
-
- // Token: 0x0400000E RID: 14
- private ISharpControl _control;
-
- // Token: 0x04000010 RID: 16
- private IContainer components;
-
- // Token: 0x04000011 RID: 17
- private TableLayoutPanel tableLayoutPanel1;
-
- // Token: 0x04000012 RID: 18
- private Label label4;
-
- // Token: 0x04000014 RID: 20
- private ComboBox sourceComboBox;
-
- // Token: 0x04000015 RID: 21
- private Label label3;
-
- // Token: 0x04000016 RID: 22
- private Button acquireButton;
-
- // Token: 0x04000017 RID: 23
- private TextBox referenceTextBox;
-
- // Token: 0x04000018 RID: 24
- private Label label5;
-
- // Token: 0x04000019 RID: 25
- private NumericUpDown integrationNumericUpDown;
-
- // Token: 0x0400001B RID: 27
- private Timer refreshTimer;
-
- // Token: 0x0400001D RID: 29
- private Button resetButton;
-
- // Token: 0x0400001E RID: 30
- private Button rebuildButton;
- private CheckBox enableCheckBox;
- }
-}
\ No newline at end of file
diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx b/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx
deleted file mode 100644
index c7ebc73..0000000
--- a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 17, 17
-
-
- 78
-
-
\ No newline at end of file
diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs b/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs
deleted file mode 100644
index 919fcc0..0000000
--- a/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs
+++ /dev/null
@@ -1,98 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO.Ports;
-using System.Threading;
-using System.Windows.Forms;
-
-using SDRSharp.Common;
-using SDRSharp.Radio;
-using SDRSharp.PanView; //For Signal Meter, Spectrum, etc
-
-namespace SDRSharp.XDR
-{
- public partial class XDRPlugin : ISharpPlugin
- {
- //Plugin Display Name
- public string DisplayName
- {
- get
- {
- return "XDR-GTK Server";
- }
- }
-
- //Which class should it load for GUI
- public UserControl Gui
- {
- get
- {
- return this._controlPanel;
- }
- }
-
- // When the plugin starts it will call this
- public void Initialize(ISharpControl control)
- {
- XDRPlugin._sdr = control;
- XDRPlugin._continue = false;
- XDRPlugin._waiting = false;
-
- this._comThread = new Thread(new ThreadStart(SerialCommands.ComThreadEngine));
- this._processor = new AmplitudeProcessor();
- this._controlPanel = new SettingsPanel(this, this._processor, XDRPlugin._sdr);
- this._controlPanel.enableXdrCheckBox.Checked = this._controlPanel.XdrEnabled;
- this._controlPanel.comPortsBox.SelectedIndex = this._controlPanel.comIndex;
- this._controlPanel.BaudrateBox.SelectedIndex = this._controlPanel.BaudIndex;
-
- //For Signal meter
- this.spectrumAnalyzer = new SpectrumAnalyzer();
- this.spectrumAnalyzer.EnableSNR = true;
-
- //Hook into RDS stream
- XDRPlugin._sdr.RegisterStreamHook(new RDSHandle(), ProcessorType.RDSBitStream);
- }
-
- // When you close SDR# it calls this
- public void Close()
- {
- Utils.SaveSetting("enableXdr", this._controlPanel.XdrEnabled);
- Utils.SaveSetting("XdrComIndex", this._controlPanel.comIndex);
- Utils.SaveSetting("BaudIndex", this._controlPanel.BaudIndex);
- if (XDRPlugin._continue)
- {
- XDRPlugin._waiting = true;
- while (XDRPlugin._waiting)
- {
- Thread.Sleep(10);
- }
- XDRPlugin._serialPort.Close();
- XDRPlugin._serialPort = null;
- this._comThread.Join();
- }
- }
-
- //For signal meter
- private SpectrumAnalyzer spectrumAnalyzer;
-
- //For GUI
- private SettingsPanel _controlPanel;
-
- //For custom Signal Meter
- private AmplitudeProcessor _processor;
-
- //For Communication
- private Thread _comThread;
- public static SerialPort _serialPort;
- public static bool _continue;
- public static bool _waiting;
-
-
- //Main controls are here (set frequency, start radio, stop radio, etx)
- public static ISharpControl _sdr;
-
- //for RDS
- public static ushort PI_Code;
- public static string RDS_Group = null;
- public static bool RDSDetected;
- }
-}
diff --git a/SDRSharp.XDR/Properties/Resources.Designer.cs b/SDRSharp.XDR/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..d8cbacc
--- /dev/null
+++ b/SDRSharp.XDR/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace SDRSharp.XDR.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ public class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SDRSharp.XDR.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ public static System.Drawing.Bitmap Wolf {
+ get {
+ object obj = ResourceManager.GetObject("Wolf", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx b/SDRSharp.XDR/Properties/Resources.resx
similarity index 93%
rename from SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx
rename to SDRSharp.XDR/Properties/Resources.resx
index ef18fa4..8b461f1 100644
--- a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx
+++ b/SDRSharp.XDR/Properties/Resources.resx
@@ -117,7 +117,8 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 17, 17
-
+
+
+ ..\Resources\Wolf.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/SDRSharp.XDR/RDS/RDSFunctions.cs b/SDRSharp.XDR/RDS/RDSFunctions.cs
index 878c67c..86c8b9f 100644
--- a/SDRSharp.XDR/RDS/RDSFunctions.cs
+++ b/SDRSharp.XDR/RDS/RDSFunctions.cs
@@ -68,5 +68,17 @@ private enum groupType : byte
RDS_TYPE_15A = 0x001E,
RDS_TYPE_15B = 0x001F
}
+ public static void ParseData(string data)
+ {
+ //We are parsing ASCII G Protocol
+ string[] DataArr = data.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
+ if (DataArr[0] == "G:") //just check if we are not sending garbage or someone else is trying to poison our message :)
+ {
+ string RDSGroup = DataArr[1];
+ ushort PI = ushort.Parse(RDSGroup.Substring(0, 4)); //Short is 4 bytes long so it should never fail
+ XDRPlugin.RDS_PI = PI;
+ XDRPlugin.RDS_Group = RDSGroup;
+ }
+ }
}
}
diff --git a/SDRSharp.XDR/RDS/RDSHandle.cs b/SDRSharp.XDR/RDS/RDSHandle.cs
index c6cb31c..d89d7e6 100644
--- a/SDRSharp.XDR/RDS/RDSHandle.cs
+++ b/SDRSharp.XDR/RDS/RDSHandle.cs
@@ -22,7 +22,7 @@ public bool Enabled
public void Process(ref RdsFrame _rdsFrame)
{
string text = string.Format("{0:X}", _rdsFrame.GroupA);
- if (text.Length == 4)
+ if (text.Length == 4 && (!XDRPlugin.ExternalRDS))
{
XDRPlugin.RDS_Group = _rdsFrame.GroupB.ToString("X4") + _rdsFrame.GroupC.ToString("X4") + _rdsFrame.GroupD.ToString("X4");
}
diff --git a/SDRSharp.XDR/Resources/Wolf.jpg b/SDRSharp.XDR/Resources/Wolf.jpg
new file mode 100644
index 0000000..8b66a4b
Binary files /dev/null and b/SDRSharp.XDR/Resources/Wolf.jpg differ
diff --git a/SDRSharp.XDR/SDRSharp.XDR.csproj b/SDRSharp.XDR/SDRSharp.XDR.csproj
index 88ee5cc..bb279a6 100644
--- a/SDRSharp.XDR/SDRSharp.XDR.csproj
+++ b/SDRSharp.XDR/SDRSharp.XDR.csproj
@@ -81,6 +81,11 @@
AdvancedRDSWindow.cs
+
+ True
+ True
+ Resources.resx
+
@@ -91,15 +96,29 @@
SettingsPanel.cs
+
+ Component
+
+
+ Form
+
+
+
+ AdvancedRDSWindow.cs
+
+
+ PublicResXFileCodeGenerator
+ Resources.Designer.cs
+
SettingsPanel.cs
-
+
\ No newline at end of file
diff --git a/SDRSharp.XDR/SerialCommands.cs b/SDRSharp.XDR/SerialCommands.cs
index c52fe18..559f9fd 100644
--- a/SDRSharp.XDR/SerialCommands.cs
+++ b/SDRSharp.XDR/SerialCommands.cs
@@ -213,19 +213,33 @@ public static void ComThreadEngine()
SP.Write((XDRPlugin._sdr.FmPilotIsDetected) ? "S" : "M"); //M = Forced Mono, m = normal Mono
}
serial_signal(XDRPlugin._sdr.VisualSNR, 2); //Signal
- SP.Write("\n");
+ SP.Write("\r\n");
//RDS
- if (XDRPlugin._sdr.RdsPICode != 0)
+ if (!XDRPlugin.ExternalRDS) //We are using SDR# Internal RDS so do its mumbo-jumbo
{
- serial_pi(XDRPlugin._sdr.RdsPICode, PI_CORRECT);
- SP.Write("R");
- SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction
- SP.Write("\n");
+ if (XDRPlugin._sdr.RdsPICode != 0)
+ {
+ serial_pi(XDRPlugin._sdr.RdsPICode, PI_CORRECT);
+ SP.Write("R");
+ SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction
+ SP.Write("\r\n");
+ }
+ XDRPlugin.RDS_Group = null;
+ }
+ else //We are using RDSSpy as RDS Decoder
+ {
+ if (XDRPlugin.RDSDetected)
+ {
+ serial_pi(XDRPlugin.RDS_PI, PI_CORRECT);
+ SP.Write("R");
+ SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction
+ SP.Write("\r\n");
+ }
+ //XDRPlugin._sdr.RdsPICode = 0;
+ XDRPlugin.RDS_Group = null;
}
- //XDRPlugin._sdr.RdsPICode = 0;
- XDRPlugin.RDS_Group = null;
}
}
XDRPlugin._waiting = false;
diff --git a/SDRSharp.XDR/SettingsPanel.Designer.cs b/SDRSharp.XDR/SettingsPanel.Designer.cs
index c07fff5..268ec8d 100644
--- a/SDRSharp.XDR/SettingsPanel.Designer.cs
+++ b/SDRSharp.XDR/SettingsPanel.Designer.cs
@@ -54,9 +54,9 @@ public void InitializeComponent()
this.mainTableLayoutPanel.Controls.Add(this.enableXdrCheckBox, 0, 0);
this.mainTableLayoutPanel.Controls.Add(this.label1, 0, 1);
this.mainTableLayoutPanel.Controls.Add(this.label2, 1, 1);
- this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 1, 2);
- this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 0, 2);
this.mainTableLayoutPanel.Controls.Add(this.AdvancedRDS, 0, 3);
+ this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 1, 2);
+ this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 0, 2);
this.mainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.mainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
this.mainTableLayoutPanel.Name = "mainTableLayoutPanel";
@@ -96,7 +96,7 @@ public void InitializeComponent()
this.comPortsBox.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.comPortsBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comPortsBox.FormattingEnabled = true;
- this.comPortsBox.Location = new System.Drawing.Point(105, 39);
+ this.comPortsBox.Location = new System.Drawing.Point(3, 39);
this.comPortsBox.Name = "comPortsBox";
this.comPortsBox.Size = new System.Drawing.Size(96, 21);
this.comPortsBox.TabIndex = 2;
@@ -107,7 +107,7 @@ public void InitializeComponent()
this.BaudrateBox.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.BaudrateBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.BaudrateBox.FormattingEnabled = true;
- this.BaudrateBox.Location = new System.Drawing.Point(3, 39);
+ this.BaudrateBox.Location = new System.Drawing.Point(105, 39);
this.BaudrateBox.Name = "BaudrateBox";
this.BaudrateBox.Size = new System.Drawing.Size(96, 21);
this.BaudrateBox.TabIndex = 3;
@@ -122,6 +122,7 @@ public void InitializeComponent()
this.AdvancedRDS.TabIndex = 2;
this.AdvancedRDS.Text = "Advanced RDS";
this.AdvancedRDS.UseVisualStyleBackColor = true;
+ this.AdvancedRDS.Click += new System.EventHandler(this.AdvancedRDS_Click);
//
// SettingsPanel
//
@@ -131,6 +132,7 @@ public void InitializeComponent()
this.mainTableLayoutPanel.ResumeLayout(false);
this.mainTableLayoutPanel.PerformLayout();
this.ResumeLayout(false);
+
}
#endregion
diff --git a/SDRSharp.XDR/SettingsPanel.cs b/SDRSharp.XDR/SettingsPanel.cs
index 7d868a0..f6f17c9 100644
--- a/SDRSharp.XDR/SettingsPanel.cs
+++ b/SDRSharp.XDR/SettingsPanel.cs
@@ -90,5 +90,10 @@ private void BaudrateBox_SelectedIndexChanged(object sender, EventArgs e)
this.BaudIndex = this.BaudrateBox.SelectedIndex;
this._plugin.PopulateComPort();
}
+ //We will open another windows when we click
+ private void AdvancedRDS_Click(object sender, EventArgs e)
+ {
+ AdvancedRDSWindow.Instance.Show();
+ }
}
}
diff --git a/SDRSharp.XDR/Tools/CustomTooltip.cs b/SDRSharp.XDR/Tools/CustomTooltip.cs
new file mode 100644
index 0000000..f97accc
--- /dev/null
+++ b/SDRSharp.XDR/Tools/CustomTooltip.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace SDRSharp.XDR.Tools
+{
+ class CustomToolTip : ToolTip
+ {
+ Image img;
+ public CustomToolTip()
+ {
+ this.LoadImage(SDRSharp.XDR.Properties.Resources.ResourceManager.GetObject("Wolf"));
+ this.OwnerDraw = true;
+ this.Popup += new PopupEventHandler(this.OnPopup);
+ this.Draw += new DrawToolTipEventHandler(this.OnDraw);
+ }
+
+ public void LoadImage(object ImageResource)
+ {
+ this.img = (Image)ImageResource;
+ }
+ public Image LoadImage()
+ {
+ return this.img;
+ }
+
+ private void OnPopup(object sender, PopupEventArgs e)
+ {
+ e.ToolTipSize = new Size(LoadImage().Width, LoadImage().Height);
+ }
+
+ private void OnDraw(object sender, DrawToolTipEventArgs e)
+ {
+
+
+ e.Graphics.DrawImage(img, 0, 0);
+ }
+ }
+}
diff --git a/SDRSharp.XDR/Tools/WinformTools.cs b/SDRSharp.XDR/Tools/WinformTools.cs
new file mode 100644
index 0000000..5616df7
--- /dev/null
+++ b/SDRSharp.XDR/Tools/WinformTools.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace SDRSharp.XDR
+{
+ public partial class AdvancedRDSWindow : Form //Hook into Title hover event https://stackoverflow.com/a/40683532/3368585
+ {
+ [DllImport("user32.dll")]
+ private static extern int TrackMouseEvent(ref TRACK_MOUSE_EVENT lpEventTrack);
+ [StructLayout(LayoutKind.Sequential)]
+ private struct TRACK_MOUSE_EVENT
+ {
+ public uint cbSize;
+ public uint dwFlags;
+ public IntPtr hwndTrack;
+ public uint dwHoverTime;
+ public static readonly TRACK_MOUSE_EVENT Empty;
+ }
+ private TRACK_MOUSE_EVENT track = TRACK_MOUSE_EVENT.Empty;
+ const int WM_NCMOUSEMOVE = 0xA0;
+ const int WM_NCMOUSEHOVER = 0x2A0;
+ const int TME_HOVER = 0x1;
+ const int TME_NONCLIENT = 0x10;
+ public event EventHandler NonClientMouseHover;
+ protected override void WndProc(ref Message m)
+ {
+ base.WndProc(ref m);
+ if (m.Msg == WM_NCMOUSEMOVE)
+ {
+ track.hwndTrack = this.Handle;
+ track.cbSize = (uint)Marshal.SizeOf(track);
+ track.dwFlags = TME_HOVER | TME_NONCLIENT;
+ track.dwHoverTime = 500;
+ TrackMouseEvent(ref track);
+ }
+ if (m.Msg == WM_NCMOUSEHOVER)
+ {
+ var handler = NonClientMouseHover;
+ if (handler != null)
+ NonClientMouseHover(this, EventArgs.Empty);
+ }
+ }
+ }
+}
diff --git a/SDRSharp.XDR/UDP.cs b/SDRSharp.XDR/UDP.cs
new file mode 100644
index 0000000..5fb0eef
--- /dev/null
+++ b/SDRSharp.XDR/UDP.cs
@@ -0,0 +1,132 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SDRSharp.XDR
+{
+ class UDPServer
+ {
+ public static int listenPort = 8888;
+ public static void Serve()
+ {
+ bool done = false;
+ UdpClient listener = new UdpClient(listenPort);
+ IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
+ byte[] receive_byte_array;
+ try
+
+ {
+ while (!done)
+ {
+ Debug.WriteLine("Waiting for broadcast");
+
+ receive_byte_array = listener.Receive(ref groupEP);
+ if (groupEP != null) //If we have any data on UDP we have RDS
+ {
+ XDRPlugin.RDSDetected = true;
+ SerialCommands.ParseData(Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length));
+ }
+ else
+ {
+ XDRPlugin.RDSDetected = false;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine(e.ToString());
+ }
+ listener.Close();
+ }
+ }
+ class UDPClient
+ {
+ class Program
+
+ {
+ static void test(string[] args)
+ {
+ Boolean done = false;
+ Boolean exception_thrown = false;
+
+ Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
+ ProtocolType.Udp);
+
+ IPAddress send_to_address = IPAddress.Parse("192.168.2.255");
+
+ IPEndPoint sending_end_point = new IPEndPoint(send_to_address, 11000);
+
+ #region comments
+ // The below three lines of code will not work. They appear to load
+
+ // the variable broadcast_string witha broadcast address. But that
+
+ // address causes an exception when performing the send.
+
+ //
+
+ //string broadcast_string = IPAddress.Broadcast.ToString();
+
+ //Console.WriteLine("broadcast_string contains {0}", broadcast_string);
+
+ //send_to_address = IPAddress.Parse(broadcast_string);
+
+ #endregion
+
+ Console.WriteLine("Enter text to broadcast via UDP.");
+ Console.WriteLine("Enter a blank line to exit the program.");
+ while (!done)
+ {
+ Console.WriteLine("Enter text to send, blank line to quit");
+ string text_to_send = Console.ReadLine();
+ if (text_to_send.Length == 0)
+ {
+ done = true;
+ }
+ else
+
+ {
+ // the socket object must have an array of bytes to send.
+
+ // this loads the string entered by the user into an array of bytes.
+
+ byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send);
+
+ // Remind the user of where this is going.
+
+ Console.WriteLine("sending to address: {0} port: {1}",
+ sending_end_point.Address,
+ sending_end_point.Port);
+ try
+
+ {
+ sending_socket.SendTo(send_buffer, sending_end_point);
+ }
+ catch (Exception send_exception)
+ {
+ exception_thrown = true;
+ Console.WriteLine(" Exception {0}", send_exception.Message);
+ }
+ if (exception_thrown == false)
+ {
+ Console.WriteLine("Message has been sent to the broadcast address");
+ }
+ else
+
+ {
+ exception_thrown = false;
+ Console.WriteLine("The exception indicates the message was not sent.");
+ }
+ }
+ } // end of while (!done)
+
+ } // end of main()
+
+ } // end of class Program
+ }
+}
diff --git a/SDRSharp.XDR/XDRPlugin.cs b/SDRSharp.XDR/XDRPlugin.cs
index f94c1f4..f6f8ac1 100644
--- a/SDRSharp.XDR/XDRPlugin.cs
+++ b/SDRSharp.XDR/XDRPlugin.cs
@@ -87,7 +87,11 @@ public void Close()
public static ISharpControl _sdr;
//for RDS
+ public static ushort RDS_PI;
public static string RDS_Group = null;
- public static bool RDSDetected;
+ public static bool RDSDetected = false;
+
+ //For AdvancedRDSWindow
+ public static bool ExternalRDS = false;
}
}