├── HueLight+
├── HueLight.ico
├── packages.config
├── App.config
├── Properties
│ ├── Settings.settings
│ ├── Settings.Designer.cs
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── Program.cs
├── Logger.cs
├── HueBuffer.cs
├── app.manifest
├── HueLight+.csproj
├── Driver
│ ├── Interop.cs
│ └── DesktopMirror.cs
├── HuePort.cs
├── Form1.cs
├── AmbiLight.cs
├── Form1.Designer.cs
└── Form1.resx
├── LICENSE
├── HueLight+.sln
├── readme.md
└── .gitignore
/HueLight+/HueLight.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piet-v/HueLightPlus/HEAD/HueLight+/HueLight.ico
--------------------------------------------------------------------------------
/HueLight+/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/HueLight+/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/HueLight+/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/HueLight+/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace Ambilight_DFMirage
8 | {
9 | static class Program
10 | {
11 | ///
12 | /// The main entry point for the application.
13 | ///
14 | [STAThread]
15 | static void Main()
16 | {
17 | Application.EnableVisualStyles();
18 | Application.SetCompatibleTextRenderingDefault(false);
19 | Application.Run(new Form1());
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/HueLight+/Logger.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 |
5 | namespace HueLightPlus
6 | {
7 | class Logger
8 | {
9 | private static List logger = new List();
10 |
11 | public static void Add(String logLine)
12 | {
13 | logger.Add(logLine);
14 | }
15 |
16 | public static void AddLine(String logLine)
17 | {
18 | Add("");
19 | Add("****" + logLine + "****");
20 | Add("");
21 | }
22 |
23 | public static void ToFile()
24 | {
25 | File.WriteAllLines("log.txt", logger);
26 | Reset();
27 | }
28 |
29 | public static void Reset()
30 | {
31 | logger = new List();
32 | }
33 |
34 | public static void Finish()
35 | {
36 | Add("-------------------------------------------------------------------");
37 | Add("Log End");
38 | Add(DateTime.Now.ToString());
39 | ToFile();
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Piet Vandeput
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/HueLight+.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.26730.3
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HueLight+", "HueLight+\HueLight+.csproj", "{E16DC1D6-BE71-4190-94AD-06911BC0AB1C}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {E16DC1D6-BE71-4190-94AD-06911BC0AB1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {E16DC1D6-BE71-4190-94AD-06911BC0AB1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {E16DC1D6-BE71-4190-94AD-06911BC0AB1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {E16DC1D6-BE71-4190-94AD-06911BC0AB1C}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {DBFBF3FB-3E03-4819-868B-A5DCFBEF7E0D}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/HueLight+/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace HueLightPlus.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # HueLight+
2 | Ambilight-clone for NZXT HUE+
3 | [Latest Release](https://github.com/piet-v/HueLightPlus/releases/latest)
4 |
5 | # Showcase video
6 | [https://www.youtube.com/watch?v=hn5HEN5PzPE](https://www.youtube.com/watch?v=hn5HEN5PzPE)
7 |
8 | # Features
9 | * Ambilight
10 | * High fps LED color updates (depending on CPU + resolution)
11 | * Supports max 1 Hue+
12 | * Supports max 2 Channels
13 | * Supports max 4 LED strips / channel
14 | * Supports config.json to configure before launch
15 |
16 | # Requirements
17 | * Windows
18 | * [NZXT HUE+](https://www.nzxt.com/products/hue-plus)
19 | * [DFMirage Mirror Driver](http://www.demoforge.com/dfmirage.htm)
20 |
21 | # Configuration
22 | * A Config.json file can be used to control certain settings.
23 | * bool startsHidden;
24 | * double gamma;
25 | * byte delay
26 | * int scanDepth
27 | * int pixelsToSkipPerCoordinate
28 | * String devices.port
29 | * int Screenregion[side].leds.channel
30 | * int Screenregion[side].leds.number
31 |
32 | # Todo
33 | * Configure through UI
34 | * Support more than 1 HUE+
35 | * Multi monitor
36 | * Turn off LEDs after closing the software
37 | * (Maybe) NZXT Kraken Support
38 | * (Maybe) NZXT AER FAN Support
39 |
40 | # Bugs
41 | * Feel free to post issues on this github page
42 |
43 | # Credits
44 | * [h0uri](http://www.instructables.com/member/h0uri/) whos C# Ambilight algorithm was way faster and thus got used as the basis for this.
45 | * [kusti8](https://github.com/kusti8/hue-plus) whos project contained an example of the reverse engineered Hue+ protocol
46 |
--------------------------------------------------------------------------------
/HueLight+/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Ambilight DFMirage")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("Ambilight DFMirage")]
13 | [assembly: AssemblyCopyright("Copyright © 2016")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("e16dc1d6-be71-4190-94ad-06911bc0ab1c")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/HueLight+/HueBuffer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.IO.Ports;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace HueLightPlus
10 | {
11 | class HueBuffer
12 | {
13 | public byte[] buffer = new byte[125];
14 | private byte[] readBuffer = new byte[125];
15 | private const byte magicBit = 75;
16 | private const byte ledStripsPerChannel = 4; // Always assume max amount of strips is connected or serial stream fails (for now)
17 | private const byte animationMode = 0;
18 | private const byte animationDirection = 0;
19 | private const byte animationOptions = 0;
20 | private const byte animationGroup = 0;
21 | private const byte animationSpeed = 2;
22 |
23 | public HueBuffer(byte channel)
24 | {
25 | buffer[0] = magicBit;
26 | buffer[1] = channel;
27 | buffer[2] = animationMode;
28 | buffer[3] = animationDirection << 4 | animationOptions << 3 | ledStripsPerChannel;
29 | buffer[4] = 0 << 5 | animationGroup << 3 | animationSpeed;
30 | }
31 |
32 | public void WriteAndCallback(SerialPort serialPort, Action Callback)
33 | {
34 | try
35 | {
36 | serialPort.Write(buffer, 0, buffer.Length);
37 | }
38 | catch(Exception e)
39 | {
40 | Logger.Add("Tried writing to closed port: " + e);
41 | }
42 |
43 | WaitForBufferReceived(serialPort, Callback);
44 | }
45 |
46 | private void WaitForBufferReceived(SerialPort serialPort, Action Callback)
47 | {
48 | try
49 | {
50 | serialPort.BaseStream.BeginRead(readBuffer, 0, readBuffer.Length, (IAsyncResult ar) =>
51 | {
52 | try
53 | {
54 | serialPort.BaseStream.EndRead(ar);
55 | }
56 | catch (Exception e)
57 | {
58 | Logger.Add("Tried reading from closed port: " + e);
59 | }
60 | finally
61 | {
62 | Callback();
63 | }
64 |
65 | }, null);
66 | }
67 | catch (Exception e)
68 | {
69 | Logger.Add("Tried reading from closed port: " + e);
70 | Callback();
71 | }
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/HueLight+/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace HueLightPlus.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HueLightPlus.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/HueLight+/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
52 |
59 |
60 |
61 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/HueLight+/HueLight+.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {E16DC1D6-BE71-4190-94AD-06911BC0AB1C}
8 | WinExe
9 | Properties
10 | HueLightPlus
11 | HueLight+
12 | v4.5.2
13 | 512
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | TRACE;DEBUG
23 | prompt
24 | 4
25 |
26 |
27 | AnyCPU
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 | HueLight.ico
37 |
38 |
39 | app.manifest
40 |
41 |
42 |
43 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Form
61 |
62 |
63 | Form1.cs
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | Form1.cs
74 |
75 |
76 | ResXFileCodeGenerator
77 | Resources.Designer.cs
78 | Designer
79 |
80 |
81 | True
82 | Resources.resx
83 | True
84 |
85 |
86 |
87 |
88 | SettingsSingleFileGenerator
89 | Settings.Designer.cs
90 |
91 |
92 | True
93 | Settings.settings
94 | True
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
111 |
--------------------------------------------------------------------------------
/HueLight+/Driver/Interop.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace driver
5 | {
6 |
7 | public enum OperationType
8 | {
9 | dmf_dfo_IGNORE = 0,
10 | dmf_dfo_FROM_SCREEN = 1,
11 | dmf_dfo_FROM_DIB = 2,
12 | dmf_dfo_TO_SCREEN = 3,
13 |
14 | dmf_dfo_SCREEN_SCREEN = 11,
15 | dmf_dfo_BLIT = 12,
16 | dmf_dfo_SOLIDFILL = 13,
17 | dmf_dfo_BLEND = 14,
18 | dmf_dfo_TRANS = 15,
19 | dmf_dfo_PLG = 17,
20 | dmf_dfo_TEXTOUT = 18,
21 |
22 | dmf_dfo_Ptr_Engage = 48, // point is used with this record
23 | dmf_dfo_Ptr_Avert = 49,
24 |
25 | // 1.0.9.0
26 | // mode-assert notifications to manifest PDEV limbo status
27 | dmf_dfn_assert_on = 64, // DrvAssert(TRUE): PDEV reenabled
28 | dmf_dfn_assert_off = 65, // DrvAssert(FALSE): PDEV disabled
29 | }
30 |
31 | [StructLayout(LayoutKind.Sequential)]
32 | public struct ChangesBuffer
33 | {
34 | public uint counter;
35 |
36 | public const int MAXCHANGES_BUF = 20000;
37 |
38 | [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXCHANGES_BUF)]
39 | public ChangesRecord[] pointrect;
40 | }
41 |
42 | [StructLayout(LayoutKind.Sequential)]
43 | public struct ChangesRecord
44 | {
45 | public uint type;
46 | public Rectangle rect;
47 | public Rectangle origrect;
48 | public Point point;
49 | public uint color;
50 | public uint refcolor;
51 | }
52 |
53 | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
54 | public struct DisplayDevice
55 | {
56 | public int CallBack;
57 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
58 | public string DeviceName;
59 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
60 | public string DeviceString;
61 | public int StateFlags;
62 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
63 | public string DeviceID;
64 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
65 | public string DeviceKey;
66 | }
67 |
68 | [StructLayout(LayoutKind.Sequential)]
69 | public struct DeviceMode
70 | {
71 |
72 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
73 | public string dmDeviceName;
74 | [MarshalAs(UnmanagedType.U2)] // WORD
75 | public short dmSpecVersion;
76 | [MarshalAs(UnmanagedType.U2)] // WORD
77 | public short dmDriverVersion;
78 | [MarshalAs(UnmanagedType.U2)] // WORD
79 | public short dmSize;
80 | [MarshalAs(UnmanagedType.U2)] // WORD
81 | public short dmDriverExtra;
82 | [MarshalAs(UnmanagedType.U4)] // DWORD
83 | public int dmFields;
84 |
85 | [MarshalAs(UnmanagedType.U2)] // WORD
86 | public short dmOrientation;
87 | [MarshalAs(UnmanagedType.U2)] // WORD
88 | public short dmPaperSize;
89 | [MarshalAs(UnmanagedType.U2)] // WORD
90 | public short dmPaperLength;
91 | [MarshalAs(UnmanagedType.U2)] // WORD
92 | public short dmPaperWidth;
93 | [MarshalAs(UnmanagedType.U2)] // WORD
94 | public short dmScale;
95 | [MarshalAs(UnmanagedType.U2)] // WORD
96 | public short dmCopies;
97 | [MarshalAs(UnmanagedType.U2)] // WORD
98 | public short dmDefaultSource;
99 | [MarshalAs(UnmanagedType.U2)] // WORD
100 | public short dmPrintQuality;
101 |
102 |
103 | [MarshalAs(UnmanagedType.I2)] // short
104 | public short dmColor;
105 | [MarshalAs(UnmanagedType.I2)] // short
106 | public short dmDuplex;
107 | [MarshalAs(UnmanagedType.I2)] // short
108 | public short dmYResolution;
109 | [MarshalAs(UnmanagedType.I2)] // short
110 | public short dmTTOption;
111 | [MarshalAs(UnmanagedType.I2)] // short
112 | public short dmCollate;
113 | [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
114 | public string dmFormName;
115 | [MarshalAs(UnmanagedType.U2)] // WORD
116 | public short dmLogPixels;
117 | [MarshalAs(UnmanagedType.U4)] // DWORD
118 | public int dmBitsPerPel;
119 | [MarshalAs(UnmanagedType.U4)] // DWORD
120 | public int dmPelsWidth;
121 | [MarshalAs(UnmanagedType.U4)] // DWORD
122 | public int dmPelsHeight;
123 |
124 | [MarshalAs(UnmanagedType.U4)] // DWORD
125 | public int dmDisplayFlags;
126 |
127 | [MarshalAs(UnmanagedType.U4)] // DWORD
128 | public int dmDisplayFrequency;
129 |
130 | [MarshalAs(UnmanagedType.U4)] // DWORD
131 | public int dmICMMethod;
132 | [MarshalAs(UnmanagedType.U4)] // DWORD
133 | public int dmICMIntent;
134 | [MarshalAs(UnmanagedType.U4)] // DWORD
135 | public int dmMediaType;
136 | [MarshalAs(UnmanagedType.U4)] // DWORD
137 | public int dmDitherType;
138 | [MarshalAs(UnmanagedType.U4)] // DWORD
139 | public int dmReserved1;
140 | [MarshalAs(UnmanagedType.U4)] // DWORD
141 | public int dmReserved2;
142 |
143 | [MarshalAs(UnmanagedType.U4)] // DWORD
144 | public int dmPanningWidth;
145 | [MarshalAs(UnmanagedType.U4)] // DWORD
146 | public int dmPanningHeight;
147 | };
148 |
149 | [StructLayout(LayoutKind.Sequential)]
150 | public struct GetChangesBuffer
151 | {
152 | ///
153 | /// Pointer to the structure. To be casted to the neccesary type a bit later...
154 | ///
155 | public IntPtr Buffer;
156 | public IntPtr UserBuffer;
157 | }
158 |
159 | [StructLayout(LayoutKind.Sequential)]
160 | public struct Point
161 | {
162 |
163 | public int x;
164 | public int y;
165 | }
166 |
167 | [StructLayout(LayoutKind.Sequential)]
168 | public struct Rectangle
169 | {
170 | public int x1;
171 | public int y1;
172 | public int x2;
173 | public int y2;
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/HueLight+/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.suo
8 | *.user
9 | *.userosscache
10 | *.sln.docstates
11 |
12 | # User-specific files (MonoDevelop/Xamarin Studio)
13 | *.userprefs
14 |
15 | # Build results
16 | [Dd]ebug/
17 | [Dd]ebugPublic/
18 | [Rr]elease/
19 | [Rr]eleases/
20 | x64/
21 | x86/
22 | bld/
23 | [Bb]in/
24 | [Oo]bj/
25 | [Ll]og/
26 |
27 | # Visual Studio 2015 cache/options directory
28 | .vs/
29 | # Uncomment if you have tasks that create the project's static files in wwwroot
30 | #wwwroot/
31 |
32 | # MSTest test Results
33 | [Tt]est[Rr]esult*/
34 | [Bb]uild[Ll]og.*
35 |
36 | # NUNIT
37 | *.VisualState.xml
38 | TestResult.xml
39 |
40 | # Build Results of an ATL Project
41 | [Dd]ebugPS/
42 | [Rr]eleasePS/
43 | dlldata.c
44 |
45 | # Benchmark Results
46 | BenchmarkDotNet.Artifacts/
47 |
48 | # .NET Core
49 | project.lock.json
50 | project.fragment.lock.json
51 | artifacts/
52 | **/Properties/launchSettings.json
53 |
54 | *_i.c
55 | *_p.c
56 | *_i.h
57 | *.ilk
58 | *.meta
59 | *.obj
60 | *.pch
61 | *.pdb
62 | *.pgc
63 | *.pgd
64 | *.rsp
65 | *.sbr
66 | *.tlb
67 | *.tli
68 | *.tlh
69 | *.tmp
70 | *.tmp_proj
71 | *.log
72 | *.vspscc
73 | *.vssscc
74 | .builds
75 | *.pidb
76 | *.svclog
77 | *.scc
78 |
79 | # Chutzpah Test files
80 | _Chutzpah*
81 |
82 | # Visual C++ cache files
83 | ipch/
84 | *.aps
85 | *.ncb
86 | *.opendb
87 | *.opensdf
88 | *.sdf
89 | *.cachefile
90 | *.VC.db
91 | *.VC.VC.opendb
92 |
93 | # Visual Studio profiler
94 | *.psess
95 | *.vsp
96 | *.vspx
97 | *.sap
98 |
99 | # TFS 2012 Local Workspace
100 | $tf/
101 |
102 | # Guidance Automation Toolkit
103 | *.gpState
104 |
105 | # ReSharper is a .NET coding add-in
106 | _ReSharper*/
107 | *.[Rr]e[Ss]harper
108 | *.DotSettings.user
109 |
110 | # JustCode is a .NET coding add-in
111 | .JustCode
112 |
113 | # TeamCity is a build add-in
114 | _TeamCity*
115 |
116 | # DotCover is a Code Coverage Tool
117 | *.dotCover
118 |
119 | # AxoCover is a Code Coverage Tool
120 | .axoCover/*
121 | !.axoCover/settings.json
122 |
123 | # Visual Studio code coverage results
124 | *.coverage
125 | *.coveragexml
126 |
127 | # NCrunch
128 | _NCrunch_*
129 | .*crunch*.local.xml
130 | nCrunchTemp_*
131 |
132 | # MightyMoose
133 | *.mm.*
134 | AutoTest.Net/
135 |
136 | # Web workbench (sass)
137 | .sass-cache/
138 |
139 | # Installshield output folder
140 | [Ee]xpress/
141 |
142 | # DocProject is a documentation generator add-in
143 | DocProject/buildhelp/
144 | DocProject/Help/*.HxT
145 | DocProject/Help/*.HxC
146 | DocProject/Help/*.hhc
147 | DocProject/Help/*.hhk
148 | DocProject/Help/*.hhp
149 | DocProject/Help/Html2
150 | DocProject/Help/html
151 |
152 | # Click-Once directory
153 | publish/
154 |
155 | # Publish Web Output
156 | *.[Pp]ublish.xml
157 | *.azurePubxml
158 | # Note: Comment the next line if you want to checkin your web deploy settings,
159 | # but database connection strings (with potential passwords) will be unencrypted
160 | *.pubxml
161 | *.publishproj
162 |
163 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
164 | # checkin your Azure Web App publish settings, but sensitive information contained
165 | # in these scripts will be unencrypted
166 | PublishScripts/
167 |
168 | # NuGet Packages
169 | *.nupkg
170 | # The packages folder can be ignored because of Package Restore
171 | **/packages/*
172 | # except build/, which is used as an MSBuild target.
173 | !**/packages/build/
174 | # Uncomment if necessary however generally it will be regenerated when needed
175 | #!**/packages/repositories.config
176 | # NuGet v3's project.json files produces more ignorable files
177 | *.nuget.props
178 | *.nuget.targets
179 |
180 | # Microsoft Azure Build Output
181 | csx/
182 | *.build.csdef
183 |
184 | # Microsoft Azure Emulator
185 | ecf/
186 | rcf/
187 |
188 | # Windows Store app package directories and files
189 | AppPackages/
190 | BundleArtifacts/
191 | Package.StoreAssociation.xml
192 | _pkginfo.txt
193 | *.appx
194 |
195 | # Visual Studio cache files
196 | # files ending in .cache can be ignored
197 | *.[Cc]ache
198 | # but keep track of directories ending in .cache
199 | !*.[Cc]ache/
200 |
201 | # Others
202 | ClientBin/
203 | ~$*
204 | *~
205 | *.dbmdl
206 | *.dbproj.schemaview
207 | *.jfm
208 | *.pfx
209 | *.publishsettings
210 | orleans.codegen.cs
211 |
212 | # Since there are multiple workflows, uncomment next line to ignore bower_components
213 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
214 | #bower_components/
215 |
216 | # RIA/Silverlight projects
217 | Generated_Code/
218 |
219 | # Backup & report files from converting an old project file
220 | # to a newer Visual Studio version. Backup files are not needed,
221 | # because we have git ;-)
222 | _UpgradeReport_Files/
223 | Backup*/
224 | UpgradeLog*.XML
225 | UpgradeLog*.htm
226 |
227 | # SQL Server files
228 | *.mdf
229 | *.ldf
230 | *.ndf
231 |
232 | # Business Intelligence projects
233 | *.rdl.data
234 | *.bim.layout
235 | *.bim_*.settings
236 |
237 | # Microsoft Fakes
238 | FakesAssemblies/
239 |
240 | # GhostDoc plugin setting file
241 | *.GhostDoc.xml
242 |
243 | # Node.js Tools for Visual Studio
244 | .ntvs_analysis.dat
245 | node_modules/
246 |
247 | # Typescript v1 declaration files
248 | typings/
249 |
250 | # Visual Studio 6 build log
251 | *.plg
252 |
253 | # Visual Studio 6 workspace options file
254 | *.opt
255 |
256 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
257 | *.vbw
258 |
259 | # Visual Studio LightSwitch build output
260 | **/*.HTMLClient/GeneratedArtifacts
261 | **/*.DesktopClient/GeneratedArtifacts
262 | **/*.DesktopClient/ModelManifest.xml
263 | **/*.Server/GeneratedArtifacts
264 | **/*.Server/ModelManifest.xml
265 | _Pvt_Extensions
266 |
267 | # Paket dependency manager
268 | .paket/paket.exe
269 | paket-files/
270 |
271 | # FAKE - F# Make
272 | .fake/
273 |
274 | # JetBrains Rider
275 | .idea/
276 | *.sln.iml
277 |
278 | # CodeRush
279 | .cr/
280 |
281 | # Python Tools for Visual Studio (PTVS)
282 | __pycache__/
283 | *.pyc
284 |
285 | # Cake - Uncomment if you are using it
286 | # tools/**
287 | # !tools/packages.config
288 |
289 | # Tabs Studio
290 | *.tss
291 |
292 | # Telerik's JustMock configuration file
293 | *.jmconfig
294 |
295 | # BizTalk build output
296 | *.btp.cs
297 | *.btm.cs
298 | *.odx.cs
299 | *.xsd.cs
--------------------------------------------------------------------------------
/HueLight+/HuePort.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.Drawing;
5 | using System.IO.Ports;
6 | using System.Linq;
7 | using System.Threading.Tasks;
8 |
9 | namespace HueLightPlus
10 | {
11 | class HuePort
12 | {
13 | public SerialPort serialPort;
14 | public HueBuffer[] buffers = new HueBuffer[] { new HueBuffer(1), new HueBuffer(2) };
15 | public double gamma = 1;
16 | public String port;
17 | public int baudRate;
18 | public byte[] gammaTable = new byte[256];
19 | public bool isEnabled = true;
20 |
21 | const byte headerBits = 5;
22 | const byte colorBits = 3;
23 |
24 | public HuePort(String port, int baudRate, double gamma, bool isEnabled)
25 | {
26 | serialPort = new SerialPort(port, baudRate);
27 | this.port = port;
28 | this.baudRate = baudRate;
29 | this.isEnabled = isEnabled;
30 |
31 | SetGamma(gamma);
32 | }
33 |
34 | /*** SERIAL PORT STATE MANAGEMENT ***/
35 |
36 | public void Open()
37 | {
38 | while (!serialPort.IsOpen)
39 | try
40 | {
41 | serialPort.Open();
42 | }
43 | catch (Exception e)
44 | {
45 | Logger.Add("Error at serial.open: " + e);
46 | }
47 | Logger.Add("opened serial port: " + port);
48 | }
49 |
50 | public void Close()
51 | {
52 | while (serialPort.IsOpen)
53 | try
54 | {
55 | serialPort.Close();
56 | }
57 | catch (Exception e)
58 | {
59 | Logger.Add("Error at serial.close: " + e);
60 | }
61 | Logger.Add("Closed serial port: " + port);
62 | }
63 |
64 | public override string ToString()
65 | {
66 | return port;
67 | }
68 |
69 | /*** GAMMA SETUP ***/
70 |
71 | public double SetGamma(double gamma)
72 | {
73 | this.gamma = gamma;
74 |
75 | SetupGammaTable(gamma);
76 |
77 | return gamma;
78 | }
79 |
80 | private void SetupGammaTable(double gamma)
81 | {
82 | for (int i = 0; i < 256; i++)
83 | {
84 | gammaTable[i] = (byte)(Math.Pow((float)i / 255.0, gamma) * 255 + 0.5);
85 | }
86 |
87 | Logger.Add("Gamma table created from " + gamma.ToString());
88 | }
89 |
90 | /*** BUFFER WRITING ***/
91 |
92 | public void WriteBuffers(Action CallBack)
93 | {
94 | Stopwatch portWriteTimer = new Stopwatch();
95 | portWriteTimer.Start();
96 |
97 | buffers[0].WriteAndCallback(serialPort, () =>
98 | {
99 | buffers[1].WriteAndCallback(serialPort, () =>
100 | {
101 | portWriteTimer.Stop();
102 | Logger.Add("Written port " + serialPort.PortName + " in: " + portWriteTimer.ElapsedMilliseconds);
103 |
104 | CallBack();
105 | });
106 | });
107 | }
108 |
109 | /*** BUFFER COLOR SETTERS ***/
110 |
111 | public void Blackout()
112 | {
113 | Color black = Color.FromArgb(0, 0, 0, 0);
114 | SetAllLedsToColor(0, black);
115 | SetAllLedsToColor(1, black);
116 |
117 | WriteBuffers(() => { });
118 | }
119 |
120 | public void SetOneLedToColor(int channel, int ledIndex, Color color)
121 | {
122 | byte[] buffer = buffers[channel].buffer;
123 |
124 | int bufferIndex = colorBits * ledIndex + headerBits;
125 | SetBufferColorAt(buffer, bufferIndex, color);
126 | }
127 |
128 | public void SetAllLedsToColor(int channel, Color color)
129 | {
130 | byte[] buffer = buffers[channel].buffer;
131 |
132 | for (int bufferIndex = headerBits; bufferIndex < buffer.Length; bufferIndex += colorBits)
133 | {
134 | SetBufferColorAt(buffer, bufferIndex, color);
135 | }
136 | }
137 |
138 | private void SetBufferColorAt(byte[] buffer, int bufferIndex, Color color)
139 | {
140 | buffer[bufferIndex++] = gammaTable[color.G];
141 | buffer[bufferIndex++] = gammaTable[color.R];
142 | buffer[bufferIndex++] = gammaTable[color.B];
143 | }
144 | }
145 |
146 | struct Device
147 | {
148 | public string port;
149 | public bool isEnabled;
150 |
151 | public Device(string port, bool isEnabled)
152 | {
153 | this.port = port;
154 | this.isEnabled = isEnabled;
155 | }
156 | }
157 |
158 | class HuePorts
159 | {
160 | public HuePort[] huePorts;
161 | public int baudRate = 256000;
162 | public double gamma;
163 |
164 | public HuePorts(Device[] devices, double gamma)
165 | {
166 | this.gamma = gamma;
167 |
168 | huePorts = new HuePort[devices.Length];
169 |
170 | for (int deviceIndex = 0; deviceIndex < devices.Length; deviceIndex++)
171 | {
172 | String port = devices[deviceIndex].port;
173 | bool isEnabled = devices[deviceIndex].isEnabled;
174 | huePorts[deviceIndex] = new HuePort(port, baudRate, gamma, isEnabled);
175 | }
176 | }
177 |
178 | public double SetGamma(double gamma)
179 | {
180 | foreach (HuePort huePort in huePorts)
181 | {
182 | huePort.SetGamma(gamma);
183 | }
184 |
185 | return gamma;
186 | }
187 |
188 | public void OpenAll()
189 | {
190 | foreach (HuePort huePort in huePorts)
191 | {
192 | huePort.Open();
193 | }
194 | }
195 |
196 | public void StopAll()
197 | {
198 | foreach (HuePort huePort in huePorts)
199 | {
200 | huePort.Close();
201 | }
202 | }
203 |
204 | public void WriteBuffers()
205 | {
206 | int threadsDone = 0;
207 |
208 | Action waitForBuffer = () =>
209 | {
210 | if (++threadsDone >= huePorts.Length)
211 | {
212 | threadsDone = 0;
213 | AmbiLight.waitHandle.Set();
214 | }
215 | };
216 |
217 | Action WriteBuffer = (HuePort huePort) =>
218 | {
219 | if (huePort.isEnabled)
220 | {
221 | huePort.WriteBuffers(waitForBuffer);
222 | }
223 | else
224 | {
225 | waitForBuffer();
226 | }
227 | };
228 |
229 | if (AmbiLight.multiThreading)
230 | {
231 | Parallel.ForEach(huePorts, WriteBuffer);
232 | }
233 | else
234 | {
235 | foreach (var huePort in huePorts)
236 | {
237 | WriteBuffer(huePort);
238 | }
239 | }
240 | }
241 | }
242 | }
243 |
--------------------------------------------------------------------------------
/HueLight+/Form1.cs:
--------------------------------------------------------------------------------
1 | using HueLightPlus;
2 | using Newtonsoft.Json;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Diagnostics;
6 | using System.Drawing;
7 | using System.Drawing.Imaging;
8 | using System.IO;
9 | using System.IO.Ports;
10 | using System.Windows.Forms;
11 |
12 | namespace Ambilight_DFMirage
13 | {
14 | public partial class Form1 : Form
15 | {
16 | PerformanceCounter total_cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");
17 | AmbiLight ambiLight;
18 |
19 | /*** FORM ON-INIT ***/
20 |
21 | public Form1()
22 | {
23 | InitializeComponent();
24 |
25 | SetupAmbiLight();
26 | SetupUiLabels();
27 |
28 | Microsoft.Win32.SystemEvents.SessionSwitch += CloseForm;
29 | Logger.Add("Hooked session switch event");
30 |
31 | ambiLight.Start();
32 | }
33 |
34 | /*** FORM ON-CLOSE ***/
35 |
36 | private void Form1_FormClosing(object sender, FormClosingEventArgs e)
37 | {
38 | ambiLight.Stop();
39 |
40 | Microsoft.Win32.SystemEvents.SessionSwitch -= CloseForm;
41 | Logger.Add("Unhooked session switch event");
42 | }
43 |
44 | /*** CONFIG METHODS ***/
45 |
46 | private void SetupAmbiLight()
47 | {
48 | dynamic config = JsonConvert.DeserializeObject(File.ReadAllText("config.json"));
49 |
50 | bool formIsHidden = config.startsHidden;
51 | double gamma = config.gamma;
52 |
53 | AmbiLight.multiThreading = config.multiThreading;
54 | AmbiLight.scanDepth = config.scanDepth;
55 | AmbiLight.pixelsToSkipPerCoordinate = config.pixelsToSkipPerCoordinate;
56 | AmbiLight.delay = config.delay;
57 | AmbiLight.frameTimeout = config.frameTimeout;
58 | AmbiLight.previewMode = config.preview;
59 |
60 | HuePorts huePorts = new HuePorts(config.devices.ToObject(), gamma);
61 | ScreenSide right = new ScreenSide(config.ambiLight.right.screenRegions.ToObject(), Direction.Right);
62 | ScreenSide left = new ScreenSide(config.ambiLight.left.screenRegions.ToObject(), Direction.Left);
63 | ScreenSide top = new ScreenSide(config.ambiLight.top.screenRegions.ToObject(), Direction.Top);
64 | ScreenSide bottom = new ScreenSide(config.ambiLight.bottom.screenRegions.ToObject(), Direction.Bottom);
65 | ScreenSide[] screenSides = new ScreenSide[] { top, right, bottom, left };
66 |
67 | ambiLight = new AmbiLight(screenSides, formIsHidden, huePorts, previewImage);
68 | Logger.Add("Loaded AmbiLight from config.json");
69 | Logger.Add("----------------------------");
70 | }
71 |
72 | private void SetupUiLabels()
73 | {
74 | multiThreadingCheckBox.Checked = AmbiLight.multiThreading;
75 | gammaTrackBar.Value = (int)(10 * Math.Round(ambiLight.huePorts.gamma, 1));
76 | scanDepthTrackBar.Value = AmbiLight.scanDepth;
77 | SkipTrackbar.Value = AmbiLight.pixelsToSkipPerCoordinate;
78 | delayTrackbar.Value = AmbiLight.delay;
79 | gammaValueLabel.Text = ambiLight.huePorts.gamma.ToString();
80 | idleTrackbar.Value = AmbiLight.frameTimeout;
81 | idleValueLabel.Text = AmbiLight.frameTimeout.ToString();
82 | previewCheckbox.Checked = AmbiLight.previewMode;
83 |
84 | foreach (var huePort in ambiLight.huePorts.huePorts)
85 | {
86 | listBox1.Items.Add(huePort);
87 | };
88 |
89 | listBox1.SelectedIndex = 0;
90 |
91 | Logger.AddLine("FORM CONFIG");
92 | Logger.Add("Loaded form labels ");
93 | }
94 |
95 | /*** REALTIME UI UPDATES ***/
96 |
97 | private void timer1_Tick_1(object sender, EventArgs e)
98 | {
99 | String fps = "FPS: " + ambiLight.fpsCounter.ToString();
100 | String cpu = "CPU: " + (Math.Round(total_cpu.NextValue())).ToString() + " %";
101 |
102 | notifyIcon1.Text = "HueLight+ - " + fps + " - " + cpu;
103 | fpsLabel.Text = fps;
104 | cpuLabel.Text = cpu;
105 |
106 | ambiLight.fpsCounter = 0;
107 | }
108 |
109 | /*** FORM INTERACTION ***/
110 |
111 | private void toggleVisibility()
112 | {
113 | if (ambiLight.formIsHidden)
114 | {
115 | Show();
116 | Logger.Add("Form Shown");
117 | }
118 | else
119 | {
120 | Hide();
121 | Logger.Add("Form formIsHidden");
122 | }
123 | ambiLight.formIsHidden = !ambiLight.formIsHidden;
124 | }
125 |
126 | private void button2_Click(object sender, EventArgs e)
127 | {
128 | toggleVisibility();
129 | }
130 |
131 | private void Form1_Shown(object sender, EventArgs e)
132 | {
133 | if (ambiLight.formIsHidden)
134 | {
135 | Hide();
136 | }
137 | }
138 |
139 | private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
140 | {
141 | toggleVisibility();
142 | }
143 |
144 | private void hideToolStripMenuItem_Click(object sender, EventArgs e)
145 | {
146 | toggleVisibility();
147 | }
148 |
149 | private void CloseForm(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
150 | {
151 | Logger.Add("Closing due to session change");
152 | Close();
153 | }
154 |
155 | private void closeToolStripMenuItem_Click(object sender, EventArgs e)
156 | {
157 | Logger.Add("Closing due to notification menu");
158 | Close();
159 | }
160 |
161 | private void trackBar1_ValueChanged(object sender, EventArgs e)
162 | {
163 | Logger.AddLine("UI - GAMMA");
164 | gammaValueLabel.Text = ambiLight.huePorts.SetGamma(gammaTrackBar.Value / 10.0).ToString();
165 | }
166 |
167 | private void checkBox1_CheckedChanged(object sender, EventArgs e)
168 | {
169 | Logger.AddLine("UI - MULTI-THREADING");
170 | AmbiLight.multiThreading = multiThreadingCheckBox.Checked;
171 | }
172 |
173 | private void trackBar2_ValueChanged(object sender, EventArgs e)
174 | {
175 | Logger.AddLine("UI - SCANDEPTH");
176 | scanDepthValueLabel.Text = ambiLight.SetScanDepth(scanDepthTrackBar.Value).ToString();
177 | }
178 |
179 | private void trackBar3_ValueChanged(object sender, EventArgs e)
180 | {
181 | Logger.AddLine("UI - SKIP");
182 | skipValueLabel.Text = ambiLight.SetPixelsToSkipPerCoordinate(SkipTrackbar.Value).ToString();
183 | }
184 |
185 | private void portEnabledCheckbox_CheckedChanged(object sender, EventArgs e)
186 | {
187 | ambiLight.huePorts.huePorts[listBox1.SelectedIndex].isEnabled = portEnabledCheckbox.Checked;
188 | if (!portEnabledCheckbox.Checked)
189 | {
190 | AmbiLight.waitHandle.WaitOne(AmbiLight.frameTimeout);
191 | ambiLight.huePorts.huePorts[listBox1.SelectedIndex].Blackout();
192 | }
193 | }
194 |
195 | private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
196 | {
197 | portEnabledCheckbox.Checked = ambiLight.huePorts.huePorts[listBox1.SelectedIndex].isEnabled;
198 | }
199 |
200 | /*** GARBAGE COLLECTION FOR DESKTOPMIRROR ***/
201 |
202 | private void timer2_Tick(object sender, EventArgs e)
203 | {
204 | Logger.ToFile();
205 | GC.Collect();
206 | GC.WaitForPendingFinalizers();
207 | }
208 |
209 | private void delayTrackbar_ValueChanged(object sender, EventArgs e)
210 | {
211 | AmbiLight.delay = delayTrackbar.Value;
212 | delayValueLabel.Text = delayTrackbar.Value.ToString();
213 | }
214 |
215 | private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
216 | {
217 | AmbiLight.previewMode = previewCheckbox.Checked;
218 |
219 | if (previewCheckbox.Checked)
220 | {
221 | this.Width = 550;
222 | }
223 | else
224 | {
225 | this.Width = 329;
226 | }
227 | }
228 |
229 | private void idleTrackbar_Scroll(object sender, EventArgs e)
230 | {
231 | AmbiLight.frameTimeout = idleTrackbar.Value;
232 | idleValueLabel.Text = idleTrackbar.Value.ToString();
233 | }
234 | }
235 | }
236 |
--------------------------------------------------------------------------------
/HueLight+/AmbiLight.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.ObjectModel;
3 | using System.Diagnostics;
4 | using System.Drawing;
5 | using System.IO.Ports;
6 | using System.Runtime.CompilerServices;
7 | using System.Threading;
8 | using System.Threading.Tasks;
9 | using System.Windows.Forms;
10 |
11 | namespace HueLightPlus
12 | {
13 | enum Direction
14 | {
15 | Left,
16 | Top,
17 | Right,
18 | Bottom
19 | };
20 |
21 | struct Led
22 | {
23 | public int channel;
24 | public int ledIndex;
25 | public int device;
26 |
27 | public Led(int device, int channel, int ledIndex)
28 | {
29 | this.device = device;
30 | this.channel = channel;
31 | this.ledIndex = ledIndex;
32 | }
33 | }
34 |
35 | struct ScreenRegion
36 | {
37 | public Led[] leds;
38 | public Collection coordinates;
39 |
40 | public ScreenRegion(Led[] leds)
41 | {
42 | this.leds = leds;
43 | this.coordinates = new Collection();
44 | }
45 | }
46 |
47 | class ScreenSide
48 | {
49 | public ScreenRegion[] screenRegions;
50 | public int screenHeight = Screen.PrimaryScreen.Bounds.Height;
51 | public int screenWidth = Screen.PrimaryScreen.Bounds.Width;
52 | private int xOrigin;
53 | private int xMax;
54 | private bool isHorizontal;
55 | public Direction direction;
56 |
57 | public ScreenSide(ScreenRegion[] screenRegions, Direction direction)
58 | {
59 | this.screenRegions = screenRegions;
60 | this.direction = direction;
61 |
62 | InitCoordinates();
63 | }
64 |
65 | public void InitCoordinates()
66 | {
67 | switch (direction)
68 | {
69 | case Direction.Right:
70 | xOrigin = screenWidth - (AmbiLight.scanDepth + 1);
71 | xMax = screenHeight;
72 | isHorizontal = true;
73 | break;
74 | case Direction.Left:
75 | xOrigin = 0;
76 | xMax = screenHeight;
77 | isHorizontal = true;
78 | break;
79 | case Direction.Top:
80 | xOrigin = 0;
81 | xMax = screenWidth;
82 | isHorizontal = false;
83 | break;
84 | default:
85 | xOrigin = screenHeight - (AmbiLight.scanDepth + 1);
86 | xMax = screenWidth;
87 | isHorizontal = false;
88 | break;
89 | }
90 |
91 | SetupCoordinates();
92 | }
93 |
94 | /*** COORDINATE DICTIONARY SETUP ***/
95 | public void SetupCoordinates()
96 | {
97 | int screenRegionAmount = screenRegions.Length;
98 |
99 | if (screenRegionAmount > 0)
100 | {
101 | int ratio = xMax / screenRegionAmount;
102 | int count = 0;
103 |
104 | for (int regionIndex = 0; regionIndex < screenRegionAmount; regionIndex++)
105 | {
106 | ref ScreenRegion screenRegion = ref screenRegions[regionIndex];
107 |
108 | screenRegion.coordinates = new Collection();
109 |
110 | for (int x = xOrigin; x < xOrigin + AmbiLight.scanDepth; x++)
111 | {
112 | int yOrigin = regionIndex * ratio;
113 | int yMax = yOrigin + ratio;
114 |
115 | for (int y = yOrigin; y < yMax; y++)
116 | {
117 | count++;
118 | if ((count % AmbiLight.pixelsToSkipPerCoordinate) == 0)
119 | {
120 | if (isHorizontal)
121 | {
122 | screenRegion.coordinates.Add(new Point(x, y));
123 | }
124 | else
125 | {
126 | screenRegion.coordinates.Add(new Point(y, x));
127 | }
128 | }
129 | }
130 | }
131 | }
132 | }
133 | }
134 | }
135 |
136 | class AmbiLight
137 | {
138 | public static bool multiThreading = false;
139 | public static readonly EventWaitHandle waitHandle = new AutoResetEvent(true);
140 | public static int scanDepth = 100;
141 | public static int pixelsToSkipPerCoordinate = 100; // Every LED region has (scanDepth * ScreenBorderPixelsInRegion / pixelsToSkipPerCoordinate) = possible coordinates. E.g. (100 * 144 / 100) = 144 coordinates;
142 | public static int delay = 0;
143 | public static int frameTimeout = 2000;
144 | public static bool previewMode = false;
145 |
146 | Stopwatch frameTimer = new Stopwatch();
147 | Stopwatch sectionTimer = new Stopwatch();
148 | public readonly driver.DesktopMirror _mirror = new driver.DesktopMirror();
149 |
150 | public HuePorts huePorts;
151 | public ScreenSide[] screenSides;
152 | public bool formIsHidden = false;
153 | public byte fpsCounter = 0;
154 | byte[] screenBuffer;
155 | bool isEngineEnabled = true;
156 | bool isReadingScreen = false;
157 | private Bitmap colorPreview;
158 | private PictureBox pictureBox;
159 | private int pictureBoxX;
160 | private int pictureBoxY;
161 |
162 | public AmbiLight(ScreenSide[] screenSides, bool formIsHidden, HuePorts huePorts, PictureBox pictureBox)
163 | {
164 | this.formIsHidden = formIsHidden;
165 | this.huePorts = huePorts;
166 | this.screenSides = screenSides;
167 | this.pictureBox = pictureBox;
168 |
169 | setupPictureBox();
170 | }
171 |
172 | private void setupPictureBox()
173 | {
174 | int left = 0;
175 | int right = 0;
176 | int top = 0;
177 | int bottom = 0;
178 |
179 | foreach (var screenSide in screenSides)
180 | {
181 | switch (screenSide.direction)
182 | {
183 | case Direction.Right:
184 | right = screenSide.screenRegions.Length;
185 | break;
186 | case Direction.Left:
187 | left = screenSide.screenRegions.Length;
188 | break;
189 | case Direction.Top:
190 | top = screenSide.screenRegions.Length;
191 | break;
192 | default:
193 | bottom = screenSide.screenRegions.Length;
194 | break;
195 | }
196 | }
197 | pictureBoxX = Math.Max(top, bottom);
198 | pictureBoxY = Math.Max(left, right) + 2;
199 |
200 | colorPreview = new Bitmap(pictureBoxX, pictureBoxY);
201 | }
202 |
203 | /*** AMBILIGHT STATE MANAGEMENT ***/
204 | public void Start()
205 | {
206 | huePorts.OpenAll();
207 | ConnectMirrorDriver();
208 |
209 | Thread a = new Thread(AmbiEngine);
210 | a.Start();
211 | Logger.Add("Thread Started");
212 | }
213 |
214 | public void Stop()
215 | {
216 | while (isReadingScreen)
217 | {
218 | ;
219 | }
220 |
221 | isEngineEnabled = false;
222 | Logger.Add("Turning off rendering");
223 |
224 | huePorts.StopAll();
225 |
226 | DisconnectMirrorDriver();
227 | Logger.Add("Exit Success");
228 | Logger.Finish();
229 | }
230 |
231 | /*** MIRROR DRIVER METHODS ***/
232 | private void ConnectMirrorDriver()
233 | {
234 | _mirror.Load();
235 | Logger.Add("Driver Loaded");
236 |
237 | _mirror.Connect();
238 | Logger.Add("Driver Connected");
239 | }
240 |
241 | private void DisconnectMirrorDriver()
242 | {
243 | _mirror.Dispose();
244 | Logger.Add("Driver Disposed");
245 | }
246 |
247 | /*** ENGINE ***/
248 | private void AmbiEngine()
249 | {
250 | frameTimer.Start();
251 |
252 | Logger.AddLine("ENGINE - START");
253 |
254 | CalculateBuffers();
255 |
256 | while (isEngineEnabled)
257 | {
258 | SendBuffers();
259 | CalculateBuffers();
260 | }
261 | }
262 |
263 | private void CalculateBuffers()
264 | {
265 | sectionTimer.Restart();
266 |
267 | try
268 | {
269 | FillBuffersFromScreen();
270 | }
271 | catch (Exception e)
272 | {
273 | Logger.Add("Error during calculations: " + e);
274 | }
275 |
276 | long bufferSeconds = sectionTimer.ElapsedMilliseconds;
277 | sectionTimer.Restart();
278 |
279 | waitHandle.WaitOne(frameTimeout);
280 | waitHandle.Reset();
281 |
282 | Logger.Add("Finished frame in: " + frameTimer.ElapsedMilliseconds);
283 | frameTimer.Restart();
284 |
285 | Logger.AddLine("FRAME");
286 | Logger.Add("Calculated buffer in: " + bufferSeconds);
287 | Logger.Add("Waiting for ports: " + sectionTimer.ElapsedMilliseconds);
288 | }
289 |
290 | /*** SEND BUFFERS ***/
291 | private void SendBuffers()
292 | {
293 | sectionTimer.Restart();
294 |
295 | huePorts.WriteBuffers();
296 | fpsCounter++;
297 |
298 | Logger.Add("Handed off buffer to serial in: " + sectionTimer.ElapsedMilliseconds);
299 | }
300 |
301 | /*** FILL BUFFERS ***/
302 | private void FillBuffersFromScreen()
303 | {
304 | if (delay > 0)
305 | {
306 | Thread.Sleep(delay);
307 | }
308 |
309 | UpdateScreenShot();
310 |
311 | if (multiThreading)
312 | {
313 | Parallel.ForEach(screenSides, FillBufferFromScreenWith);
314 | updatePreview();
315 | }
316 | else
317 | {
318 | foreach (var screenSide in screenSides)
319 | {
320 | FillBufferFromScreenWith(screenSide);
321 | updatePreview();
322 | }
323 | }
324 | }
325 |
326 | [MethodImpl(MethodImplOptions.Synchronized)]
327 | private void updatePreview()
328 | {
329 | if (previewMode)
330 | {
331 | lock (pictureBox)
332 | {
333 | pictureBox.Image = new Bitmap((Bitmap) colorPreview.Clone(), pictureBoxX, pictureBoxY);
334 | }
335 | }
336 | }
337 |
338 | private void FillBufferFromScreenWith(ScreenSide screenSide)
339 | {
340 | ScreenRegion currentScreenRegion;
341 | Collection currentLedCoordinates;
342 | int totalRed;
343 | int totalGreen;
344 | int totalBlue;
345 | int totalCoordinates;
346 | int colorIndex = 0;
347 |
348 | for (int regionIndex = 0; regionIndex < screenSide.screenRegions.Length; regionIndex++)
349 | {
350 | currentScreenRegion = screenSide.screenRegions[regionIndex];
351 | currentLedCoordinates = currentScreenRegion.coordinates;
352 |
353 | totalRed = totalGreen = totalBlue = 0;
354 | totalCoordinates = currentLedCoordinates.Count;
355 |
356 | foreach (Point currentLedCoordinate in currentLedCoordinates)
357 | {
358 | colorIndex = Screen.PrimaryScreen.Bounds.Width * 4 * currentLedCoordinate.Y + currentLedCoordinate.X * 4;
359 |
360 | totalBlue += screenBuffer[colorIndex++];
361 | totalGreen += screenBuffer[colorIndex++];
362 | totalRed += screenBuffer[colorIndex++];
363 | }
364 |
365 | Color color = Color.FromArgb(totalRed / totalCoordinates, totalGreen / totalCoordinates, totalBlue / totalCoordinates);
366 |
367 | foreach (Led currentLed in currentScreenRegion.leds)
368 | {
369 | if (huePorts.huePorts[currentLed.device].isEnabled)
370 | {
371 | huePorts.huePorts[currentLed.device].SetOneLedToColor(currentLed.channel, currentLed.ledIndex, color);
372 | }
373 | }
374 |
375 | if (previewMode)
376 | {
377 | switch (screenSide.direction)
378 | {
379 | case Direction.Right:
380 | colorPreview.SetPixel(19, regionIndex + 1, color);
381 | break;
382 | case Direction.Left:
383 | colorPreview.SetPixel(0, regionIndex + 1, color);
384 | break;
385 | case Direction.Top:
386 | colorPreview.SetPixel(regionIndex, 1, color);
387 | break;
388 | default:
389 | colorPreview.SetPixel(regionIndex, 11, color);
390 | break;
391 | }
392 | }
393 | }
394 | }
395 |
396 | /*** SCREENSHOT METHODS ***/
397 | private byte[] UpdateScreenShot()
398 | {
399 | isReadingScreen = true;
400 | try
401 | {
402 | screenBuffer = _mirror.GetScreenBuffer();
403 | }
404 | catch (Exception e)
405 | {
406 | Logger.Add("Something went wrong while getting the screen buffer:" + e);
407 | }
408 | isReadingScreen = false;
409 |
410 | return screenBuffer;
411 | }
412 |
413 | /*** CONFIG ***/
414 |
415 | public int SetScanDepth(int scanDepth)
416 | {
417 | AmbiLight.scanDepth = scanDepth;
418 |
419 | foreach (ScreenSide screenSide in screenSides)
420 | {
421 | screenSide.SetupCoordinates();
422 | }
423 |
424 | return scanDepth;
425 | }
426 |
427 | public int SetPixelsToSkipPerCoordinate(int pixelsToSkipPerCoordinate)
428 | {
429 | AmbiLight.pixelsToSkipPerCoordinate = pixelsToSkipPerCoordinate;
430 |
431 | foreach (ScreenSide screenSide in screenSides)
432 | {
433 | screenSide.SetupCoordinates();
434 | }
435 |
436 | return pixelsToSkipPerCoordinate;
437 | }
438 | }
439 | }
440 |
--------------------------------------------------------------------------------
/HueLight+/Driver/DesktopMirror.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using System.Diagnostics;
4 | using System.Drawing;
5 | using System.Drawing.Imaging;
6 | using System.Runtime.InteropServices;
7 | using System.Threading;
8 | using System.Windows.Forms;
9 | using Microsoft.Win32;
10 | using System.Collections.Generic;
11 | using System.IO;
12 |
13 | namespace driver
14 | {
15 | public class DesktopMirror : IDisposable
16 | {
17 | #region External Constants
18 |
19 | private const int Map = 1030;
20 | private const int UnMap = 1031;
21 | private const int TestMapped = 1051;
22 |
23 | private const int IGNORE = 0;
24 | private const int BLIT = 12;
25 | private const int TEXTOUT = 18;
26 | private const int MOUSEPTR = 48;
27 |
28 | private const int CDS_UPDATEREGISTRY = 0x00000001;
29 | private const int CDS_TEST = 0x00000002;
30 | private const int CDS_FULLSCREEN = 0x00000004;
31 | private const int CDS_GLOBAL = 0x00000008;
32 | private const int CDS_SET_PRIMARY = 0x00000010;
33 | private const int CDS_RESET = 0x40000000;
34 | private const int CDS_SETRECT = 0x20000000;
35 | private const int CDS_NORESET = 0x10000000;
36 | private const int MAXIMUM_ALLOWED = 0x02000000;
37 | private const int DM_BITSPERPEL = 0x40000;
38 | private const int DM_PELSWIDTH = 0x80000;
39 | private const int DM_PELSHEIGHT = 0x100000;
40 | private const int DM_POSITION = 0x00000020;
41 | #endregion
42 |
43 | #region External Methods
44 |
45 | [DllImport("user32.dll")]
46 | private static extern int ChangeDisplaySettingsEx(string lpszDeviceName, ref DeviceMode mode, IntPtr hwnd, uint dwflags, IntPtr lParam);
47 |
48 | [DllImport("gdi32.dll", SetLastError = true)]
49 | private static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
50 |
51 | [DllImport("gdi32.dll")]
52 | private static extern bool DeleteDC(IntPtr pointer);
53 |
54 | [DllImport("user32.dll")]
55 | private static extern bool EnumDisplayDevices(string lpDevice, uint ideviceIndex, ref DisplayDevice lpdevice, uint dwFlags);
56 |
57 | [DllImport("gdi32.dll", SetLastError = true)]
58 | private static extern int ExtEscape(IntPtr hdc, int nEscape, int cbInput, IntPtr lpszInData, int cbOutput, IntPtr lpszOutData);
59 |
60 | [DllImport("user32.dll", EntryPoint = "GetDC")]
61 | private static extern IntPtr GetDC(IntPtr ptr);
62 |
63 | [DllImport("user32.dll", EntryPoint = "ReleaseDC")]
64 | private static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
65 |
66 | #endregion
67 |
68 | public event EventHandler DesktopChange;
69 | public class DesktopChangeEventArgs : EventArgs
70 | {
71 | public int x1;
72 | public int y1;
73 | public int x2;
74 | public int y2;
75 | public OperationType type;
76 |
77 | public DesktopChangeEventArgs(int x1, int y1, int x2, int y2, OperationType type)
78 | {
79 | this.x1 = x1;
80 | this.y1 = y1;
81 | this.x2 = x2;
82 | this.y2 = y2;
83 | this.type = type;
84 | }
85 | }
86 |
87 | private string driverInstanceName = "";
88 | private IntPtr _getChangesBuffer = IntPtr.Zero;
89 | private Thread _pollingThread = null;
90 |
91 | private static void SafeChangeDisplaySettingsEx(string lpszDeviceName, ref DeviceMode mode, IntPtr hwnd, uint dwflags, IntPtr lParam)
92 | {
93 | int result = ChangeDisplaySettingsEx(lpszDeviceName, ref mode, hwnd, dwflags, lParam);
94 | switch (result)
95 | {
96 | case 0: return; //DISP_CHANGE_SUCCESSFUL
97 | case 1: throw new Exception("The computer must be restarted for the graphics mode to work."); //DISP_CHANGE_RESTART
98 | case -1: throw new Exception("The display driver failed the specified graphics mode."); // DISP_CHANGE_FAILED
99 | case -2: throw new Exception("The graphics mode is not supported."); // DISP_CHANGE_BADMODE
100 | case -3: throw new Exception("Unable to write settings to the registry."); // DISP_CHANGE_NOTUPDATED
101 | case -4: throw new Exception("An invalid set of flags was passed in."); // DISP_CHANGE_BADFLAGS
102 | case -5: throw new Exception("An invalid parameter was passed in. This can include an invalid flag or combination of flags."); // DISP_CHANGE_BADPARAM
103 | case -6: throw new Exception("The settings change was unsuccessful because the system is DualView capable."); // DISP_CHANGE_BADDUALVIEW
104 | }
105 | }
106 |
107 | public enum MirrorState
108 | {
109 | Idle,
110 | Loaded,
111 | Connected,
112 | Running
113 | }
114 |
115 | public MirrorState State { get; private set; }
116 |
117 | private const string driverDeviceNumber = "DEVICE0";
118 | private const string driverMiniportName = "dfmirage";
119 | private const string driverName = "Mirage Driver";
120 | private const string driverRegistryPath = "SYSTEM\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Services";
121 | private RegistryKey _registryKey;
122 |
123 |
124 | List logger = new List();
125 | public bool Load()
126 | {
127 | if (State != MirrorState.Idle)
128 | {
129 | logger.Add("Invalid Operation Exception Thrown at Load");
130 | throw new InvalidOperationException("You may call Load only if the state is Idle");
131 | }
132 |
133 | var device = new DisplayDevice();
134 | var deviceMode = new DeviceMode { dmDriverExtra = 0 };
135 |
136 | device.CallBack = Marshal.SizeOf(device);
137 | deviceMode.dmSize = (short)Marshal.SizeOf(deviceMode);
138 | deviceMode.dmBitsPerPel = Screen.PrimaryScreen.BitsPerPixel;
139 |
140 | if (deviceMode.dmBitsPerPel == 24)
141 | deviceMode.dmBitsPerPel = 32;
142 |
143 | _bitmapBpp = deviceMode.dmBitsPerPel;
144 |
145 | deviceMode.dmDeviceName = string.Empty;
146 | deviceMode.dmFields = (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION);
147 | _bitmapHeight = deviceMode.dmPelsHeight = Screen.PrimaryScreen.Bounds.Height;
148 | _bitmapWidth = deviceMode.dmPelsWidth = Screen.PrimaryScreen.Bounds.Width;
149 | logger.Add("driver res "+ Screen.PrimaryScreen.Bounds.ToString());
150 | bool deviceFound;
151 | uint deviceIndex = 0;
152 |
153 | while (deviceFound = EnumDisplayDevices(null, deviceIndex, ref device, 0))
154 | {
155 | if (device.DeviceString == driverName)
156 | break;
157 | deviceIndex++;
158 | }
159 |
160 | if (!deviceFound) return false;
161 |
162 | driverInstanceName = device.DeviceName;
163 |
164 | _registryKey = Registry.LocalMachine.OpenSubKey(driverRegistryPath, true);
165 | if (_registryKey != null)
166 | _registryKey = _registryKey.CreateSubKey(driverMiniportName);
167 | else
168 | throw new Exception("Couldn't open registry key");
169 |
170 | if (_registryKey != null)
171 | _registryKey = _registryKey.CreateSubKey(driverDeviceNumber);
172 | else
173 | throw new Exception("Couldn't open registry key");
174 |
175 | // _registryKey.SetValue("Cap.DfbBackingMode", 0);
176 | // _registryKey.SetValue("Order.BltCopyBits.Enabled", 1);
177 | _registryKey.SetValue("Attach.ToDesktop", 1);
178 |
179 | #region This was CommitDisplayChanges
180 |
181 | SafeChangeDisplaySettingsEx(device.DeviceName, ref deviceMode, IntPtr.Zero, CDS_UPDATEREGISTRY, IntPtr.Zero);
182 | SafeChangeDisplaySettingsEx(device.DeviceName, ref deviceMode, IntPtr.Zero, 0, IntPtr.Zero);
183 |
184 | #endregion
185 |
186 | State = MirrorState.Loaded;
187 |
188 | return true;
189 | }
190 |
191 | public bool Connect()
192 | {
193 | if (State != MirrorState.Loaded)
194 | throw new InvalidOperationException("You may call Connect only if the state is Loaded");
195 |
196 | bool result = mapSharedBuffers(); // Adjusts _running
197 | if (result)
198 | {
199 | State = MirrorState.Connected;
200 | }
201 |
202 | return result;
203 | }
204 |
205 | public void Start()
206 | {
207 | if (State != MirrorState.Connected)
208 | throw new InvalidOperationException("You may call Start only if the state is Connected");
209 |
210 | if (_terminatePollingThread == null)
211 | _terminatePollingThread = new ManualResetEvent(false);
212 | else
213 | _terminatePollingThread.Reset();
214 |
215 | _pollingThread = new Thread(pollingThreadProc) { IsBackground = true };
216 | _pollingThread.Start();
217 |
218 | State = MirrorState.Running;
219 | }
220 |
221 | ///
222 | /// Driver buffer polling interval, in msec.
223 | ///
224 | private const int PollInterval = 100;
225 |
226 | private void pollingThreadProc()
227 | {
228 | long oldCounter = long.MaxValue;
229 | while (true)
230 | {
231 | var getChangesBuffer = (GetChangesBuffer)Marshal.PtrToStructure(_getChangesBuffer, typeof(GetChangesBuffer));
232 | var buffer = (ChangesBuffer)Marshal.PtrToStructure(getChangesBuffer.Buffer, typeof(ChangesBuffer));
233 |
234 | // Initialize oldCounter
235 | if (oldCounter == long.MaxValue)
236 | oldCounter = buffer.counter;
237 |
238 | if (oldCounter != buffer.counter)
239 | {
240 | //Trace.WriteLine(string.Format("Counter changed. Old is {0} new is {1}", oldCounter, buffer.counter));
241 | for (long currentChange = oldCounter; currentChange != buffer.counter; currentChange++)
242 | {
243 | if (currentChange >= ChangesBuffer.MAXCHANGES_BUF)
244 | currentChange = 0;
245 |
246 | if (DesktopChange != null)
247 | DesktopChange(this,
248 | new DesktopChangeEventArgs(buffer.pointrect[currentChange].rect.x1,
249 | buffer.pointrect[currentChange].rect.y1,
250 | buffer.pointrect[currentChange].rect.x2,
251 | buffer.pointrect[currentChange].rect.y2,
252 | (OperationType)buffer.pointrect[currentChange].type));
253 | }
254 |
255 | oldCounter = buffer.counter;
256 | }
257 |
258 | // Just to prevent 100-percent CPU load and to provide thread-safety use manual reset event instead of simple in-memory flag.
259 | if (_terminatePollingThread.WaitOne(PollInterval, false))
260 | {
261 | //Trace.WriteLine("The thread now exits");
262 | break;
263 | }
264 | }
265 |
266 | // We can be sure that _pollingThreadTerminated exists
267 | _pollingThreadTerminated.Set();
268 | }
269 |
270 | private ManualResetEvent _terminatePollingThread;
271 | private ManualResetEvent _pollingThreadTerminated;
272 |
273 | private const int PollingThreadTerminationTimeout = 10000;
274 |
275 | public void Stop()
276 | {
277 | if (State != MirrorState.Running) return;
278 |
279 | if (_pollingThreadTerminated == null)
280 | _pollingThreadTerminated = new ManualResetEvent(false);
281 | else
282 | _pollingThreadTerminated.Reset();
283 |
284 | // Terminate polling thread
285 | _terminatePollingThread.Set();
286 |
287 | // Wait for it...
288 | if (!_pollingThreadTerminated.WaitOne(PollingThreadTerminationTimeout, false))
289 | _pollingThread.Abort();
290 |
291 | State = MirrorState.Connected;
292 | }
293 |
294 | public void Disconnect()
295 | {
296 | if (State == MirrorState.Running)
297 | Stop();
298 |
299 | if (State != MirrorState.Connected)
300 | return;
301 |
302 | unmapSharedBuffers();
303 | State = MirrorState.Loaded;
304 | }
305 |
306 | public void Unload()
307 | {
308 | if (State == MirrorState.Running)
309 | Stop();
310 | if (State == MirrorState.Connected)
311 | Disconnect();
312 |
313 | if (State != MirrorState.Loaded)
314 | return;
315 |
316 | var deviceMode = new DeviceMode();
317 | deviceMode.dmSize = (short)Marshal.SizeOf(typeof(DeviceMode));
318 | deviceMode.dmDriverExtra = 0;
319 | deviceMode.dmFields = (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_POSITION);
320 |
321 | var device = new DisplayDevice();
322 | device.CallBack = Marshal.SizeOf(device);
323 | deviceMode.dmDeviceName = string.Empty;
324 | uint deviceIndex = 0;
325 | while (EnumDisplayDevices(null, deviceIndex, ref device, 0))
326 | {
327 | if (device.DeviceString.Equals(driverName))
328 | break;
329 |
330 | deviceIndex++;
331 | }
332 |
333 | Debug.Assert(_registryKey != null);
334 |
335 | _registryKey.SetValue("Attach.ToDesktop", 0);
336 | _registryKey.Close();
337 |
338 | deviceMode.dmDeviceName = driverMiniportName;
339 |
340 | if (deviceMode.dmBitsPerPel == 24) deviceMode.dmBitsPerPel = 32;
341 |
342 | #region This was CommitDisplayChanges
343 |
344 | SafeChangeDisplaySettingsEx(device.DeviceName, ref deviceMode, IntPtr.Zero, CDS_UPDATEREGISTRY, IntPtr.Zero);
345 | SafeChangeDisplaySettingsEx(device.DeviceName, ref deviceMode, IntPtr.Zero, 0, IntPtr.Zero);
346 |
347 | #endregion
348 |
349 | State = MirrorState.Idle;
350 | }
351 |
352 | private IntPtr _globalDC;
353 |
354 | private bool mapSharedBuffers()
355 | {
356 | _globalDC = CreateDC(driverInstanceName, null, null, IntPtr.Zero);
357 | if (_globalDC == IntPtr.Zero)
358 | {
359 | throw new Win32Exception(Marshal.GetLastWin32Error());
360 | }
361 |
362 | if (_getChangesBuffer != IntPtr.Zero)
363 | {
364 | Marshal.FreeHGlobal(_getChangesBuffer);
365 | }
366 |
367 | _getChangesBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(GetChangesBuffer)));
368 |
369 | int res = ExtEscape(_globalDC, Map, 0, IntPtr.Zero, Marshal.SizeOf(typeof(GetChangesBuffer)), _getChangesBuffer);
370 | if (res > 0)
371 | return true;
372 |
373 | return false;
374 | }
375 |
376 | private void unmapSharedBuffers()
377 | {
378 | int res = ExtEscape(_globalDC, UnMap, Marshal.SizeOf(typeof(GetChangesBuffer)), _getChangesBuffer, 0, IntPtr.Zero);
379 | if (res < 0)
380 | throw new Win32Exception(Marshal.GetLastWin32Error());
381 |
382 | Marshal.FreeHGlobal(_getChangesBuffer);
383 | _getChangesBuffer = IntPtr.Zero;
384 |
385 | ReleaseDC(IntPtr.Zero, _globalDC);
386 | }
387 |
388 | private int _bitmapWidth, _bitmapHeight, _bitmapBpp;
389 | public Bitmap GetScreen()
390 | {
391 |
392 | if (State != MirrorState.Connected && State != MirrorState.Running)
393 | throw new InvalidOperationException("In order to get current screen you must at least be connected to the driver");
394 |
395 | PixelFormat format;
396 | if (_bitmapBpp == 16)
397 | format = PixelFormat.Format16bppRgb565;
398 | else if (_bitmapBpp == 24)
399 | format = PixelFormat.Format24bppRgb;
400 | else if (_bitmapBpp == 32)
401 | format = PixelFormat.Format32bppArgb;
402 | else
403 | {
404 | Debug.Fail("Unknown pixel format");
405 | throw new Exception("Unknown pixel format");
406 | }
407 |
408 | Bitmap result = new Bitmap(_bitmapWidth, _bitmapHeight, format);
409 |
410 | System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, _bitmapWidth, _bitmapHeight);
411 | BitmapData bmpData = result.LockBits(rect, ImageLockMode.WriteOnly, format);
412 | // Get the address of the first line.
413 | IntPtr ptr = bmpData.Scan0;
414 | // Declare an array to hold the bytes of the bitmap.
415 | int bytes = bmpData.Stride * _bitmapHeight;
416 |
417 | GetChangesBuffer getChangesBuffer = (GetChangesBuffer)Marshal.PtrToStructure(_getChangesBuffer, typeof(GetChangesBuffer));
418 | byte[] data = new byte[bytes];
419 | try
420 | {
421 | Marshal.Copy(getChangesBuffer.UserBuffer, data, 0, bytes);
422 | }
423 | catch (AccessViolationException)
424 | {
425 | }
426 |
427 | // Copy the RGB values into the bitmap.
428 | Marshal.Copy(data, 0, ptr, bytes);
429 |
430 | result.UnlockBits(bmpData);
431 |
432 | return result;
433 | }
434 |
435 | public byte[] GetScreenBuffer()
436 | {
437 | GetChangesBuffer getChangesBuffer = (GetChangesBuffer)Marshal.PtrToStructure(_getChangesBuffer, typeof(GetChangesBuffer));
438 | byte[] data = new byte[_bitmapWidth * _bitmapHeight * 4];
439 | try
440 | {
441 | Marshal.Copy(getChangesBuffer.UserBuffer, data, 0, data.Length);
442 | }
443 | catch (AccessViolationException)
444 | {
445 | }
446 |
447 | return data;
448 | }
449 |
450 | ///
451 | /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
452 | ///
453 | /// 2
454 | public void Dispose()
455 | {
456 | if (State != MirrorState.Idle)
457 | Unload();
458 | File.WriteAllLines("logDriver.txt", logger);
459 | }
460 | }
461 | }
462 |
--------------------------------------------------------------------------------
/HueLight+/Form1.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace Ambilight_DFMirage
2 | {
3 | partial class Form1
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.components = new System.ComponentModel.Container();
32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
33 | this.gammaValueLabel = new System.Windows.Forms.Label();
34 | this.cpuLabel = new System.Windows.Forms.Label();
35 | this.fpsLabel = new System.Windows.Forms.Label();
36 | this.hideButton = new System.Windows.Forms.Button();
37 | this.aboutLabel = new System.Windows.Forms.Label();
38 | this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
39 | this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
40 | this.hideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
41 | this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
42 | this.timer1 = new System.Windows.Forms.Timer(this.components);
43 | this.scanDepthLabel = new System.Windows.Forms.Label();
44 | this.gammaTrackBar = new System.Windows.Forms.TrackBar();
45 | this.gammaLabel = new System.Windows.Forms.Label();
46 | this.timer2 = new System.Windows.Forms.Timer(this.components);
47 | this.multiThreadingCheckBox = new System.Windows.Forms.CheckBox();
48 | this.skipLabel = new System.Windows.Forms.Label();
49 | this.scanDepthTrackBar = new System.Windows.Forms.TrackBar();
50 | this.scanDepthValueLabel = new System.Windows.Forms.Label();
51 | this.SkipTrackbar = new System.Windows.Forms.TrackBar();
52 | this.skipValueLabel = new System.Windows.Forms.Label();
53 | this.listBox1 = new System.Windows.Forms.ListBox();
54 | this.portEnabledCheckbox = new System.Windows.Forms.CheckBox();
55 | this.portsLabel = new System.Windows.Forms.Label();
56 | this.delayValueLabel = new System.Windows.Forms.Label();
57 | this.delayTrackbar = new System.Windows.Forms.TrackBar();
58 | this.delayLabel = new System.Windows.Forms.Label();
59 | this.previewCheckbox = new System.Windows.Forms.CheckBox();
60 | this.previewImage = new System.Windows.Forms.PictureBox();
61 | this.idleTrackbar = new System.Windows.Forms.TrackBar();
62 | this.idleLabel = new System.Windows.Forms.Label();
63 | this.idleValueLabel = new System.Windows.Forms.Label();
64 | this.label3 = new System.Windows.Forms.Label();
65 | this.label4 = new System.Windows.Forms.Label();
66 | this.contextMenuStrip1.SuspendLayout();
67 | ((System.ComponentModel.ISupportInitialize)(this.gammaTrackBar)).BeginInit();
68 | ((System.ComponentModel.ISupportInitialize)(this.scanDepthTrackBar)).BeginInit();
69 | ((System.ComponentModel.ISupportInitialize)(this.SkipTrackbar)).BeginInit();
70 | ((System.ComponentModel.ISupportInitialize)(this.delayTrackbar)).BeginInit();
71 | ((System.ComponentModel.ISupportInitialize)(this.previewImage)).BeginInit();
72 | ((System.ComponentModel.ISupportInitialize)(this.idleTrackbar)).BeginInit();
73 | this.SuspendLayout();
74 | //
75 | // gammaValueLabel
76 | //
77 | this.gammaValueLabel.AutoSize = true;
78 | this.gammaValueLabel.Location = new System.Drawing.Point(55, 110);
79 | this.gammaValueLabel.Name = "gammaValueLabel";
80 | this.gammaValueLabel.Size = new System.Drawing.Size(73, 13);
81 | this.gammaValueLabel.TabIndex = 10;
82 | this.gammaValueLabel.Text = "Gamma value";
83 | //
84 | // cpuLabel
85 | //
86 | this.cpuLabel.AutoSize = true;
87 | this.cpuLabel.Location = new System.Drawing.Point(12, 22);
88 | this.cpuLabel.Name = "cpuLabel";
89 | this.cpuLabel.Size = new System.Drawing.Size(25, 13);
90 | this.cpuLabel.TabIndex = 9;
91 | this.cpuLabel.Text = "CPU";
92 | //
93 | // fpsLabel
94 | //
95 | this.fpsLabel.AutoSize = true;
96 | this.fpsLabel.Location = new System.Drawing.Point(12, 9);
97 | this.fpsLabel.Name = "fpsLabel";
98 | this.fpsLabel.Size = new System.Drawing.Size(25, 13);
99 | this.fpsLabel.TabIndex = 8;
100 | this.fpsLabel.Text = "FPS";
101 | //
102 | // hideButton
103 | //
104 | this.hideButton.Location = new System.Drawing.Point(262, 12);
105 | this.hideButton.Name = "hideButton";
106 | this.hideButton.Size = new System.Drawing.Size(39, 23);
107 | this.hideButton.TabIndex = 15;
108 | this.hideButton.Text = "Hide";
109 | this.hideButton.UseVisualStyleBackColor = true;
110 | this.hideButton.Click += new System.EventHandler(this.button2_Click);
111 | //
112 | // aboutLabel
113 | //
114 | this.aboutLabel.AutoSize = true;
115 | this.aboutLabel.Enabled = false;
116 | this.aboutLabel.Location = new System.Drawing.Point(172, 557);
117 | this.aboutLabel.Name = "aboutLabel";
118 | this.aboutLabel.Size = new System.Drawing.Size(133, 13);
119 | this.aboutLabel.TabIndex = 13;
120 | this.aboutLabel.Text = "Author: Piet Vandeput";
121 | //
122 | // notifyIcon1
123 | //
124 | this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
125 | this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
126 | this.notifyIcon1.Text = "Ambilight DFMirage v1.1";
127 | this.notifyIcon1.Visible = true;
128 | this.notifyIcon1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
129 | //
130 | // contextMenuStrip1
131 | //
132 | this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
133 | this.hideToolStripMenuItem,
134 | this.closeToolStripMenuItem});
135 | this.contextMenuStrip1.Name = "contextMenuStrip1";
136 | this.contextMenuStrip1.ShowImageMargin = false;
137 | this.contextMenuStrip1.Size = new System.Drawing.Size(79, 48);
138 | //
139 | // hideToolStripMenuItem
140 | //
141 | this.hideToolStripMenuItem.Name = "hideToolStripMenuItem";
142 | this.hideToolStripMenuItem.Size = new System.Drawing.Size(78, 22);
143 | this.hideToolStripMenuItem.Text = "Hide";
144 | this.hideToolStripMenuItem.Click += new System.EventHandler(this.hideToolStripMenuItem_Click);
145 | //
146 | // closeToolStripMenuItem
147 | //
148 | this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
149 | this.closeToolStripMenuItem.Size = new System.Drawing.Size(78, 22);
150 | this.closeToolStripMenuItem.Text = "Close";
151 | this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
152 | //
153 | // timer1
154 | //
155 | this.timer1.Enabled = true;
156 | this.timer1.Interval = 1000;
157 | this.timer1.Tick += new System.EventHandler(this.timer1_Tick_1);
158 | //
159 | // scanDepthLabel
160 | //
161 | this.scanDepthLabel.AutoSize = true;
162 | this.scanDepthLabel.Location = new System.Drawing.Point(12, 170);
163 | this.scanDepthLabel.Name = "scanDepthLabel";
164 | this.scanDepthLabel.Size = new System.Drawing.Size(61, 13);
165 | this.scanDepthLabel.TabIndex = 16;
166 | this.scanDepthLabel.Text = "ScanDepth";
167 | //
168 | // gammaTrackBar
169 | //
170 | this.gammaTrackBar.Location = new System.Drawing.Point(12, 126);
171 | this.gammaTrackBar.Maximum = 100;
172 | this.gammaTrackBar.Name = "gammaTrackBar";
173 | this.gammaTrackBar.Size = new System.Drawing.Size(284, 45);
174 | this.gammaTrackBar.TabIndex = 18;
175 | this.gammaTrackBar.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged);
176 | //
177 | // gammaLabel
178 | //
179 | this.gammaLabel.AutoSize = true;
180 | this.gammaLabel.Location = new System.Drawing.Point(12, 110);
181 | this.gammaLabel.Name = "gammaLabel";
182 | this.gammaLabel.Size = new System.Drawing.Size(37, 13);
183 | this.gammaLabel.TabIndex = 19;
184 | this.gammaLabel.Text = "Gamma";
185 | //
186 | // timer2
187 | //
188 | this.timer2.Interval = 30000;
189 | this.timer2.Tick += new System.EventHandler(this.timer2_Tick);
190 | //
191 | // multiThreadingCheckBox
192 | //
193 | this.multiThreadingCheckBox.AutoSize = true;
194 | this.multiThreadingCheckBox.Location = new System.Drawing.Point(15, 38);
195 | this.multiThreadingCheckBox.Name = "multiThreadingCheckBox";
196 | this.multiThreadingCheckBox.Size = new System.Drawing.Size(110, 17);
197 | this.multiThreadingCheckBox.TabIndex = 20;
198 | this.multiThreadingCheckBox.Text = "MultiThreading";
199 | this.multiThreadingCheckBox.UseVisualStyleBackColor = true;
200 | this.multiThreadingCheckBox.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
201 | //
202 | // skipLabel
203 | //
204 | this.skipLabel.AutoSize = true;
205 | this.skipLabel.Location = new System.Drawing.Point(12, 234);
206 | this.skipLabel.Name = "skipLabel";
207 | this.skipLabel.Size = new System.Drawing.Size(157, 13);
208 | this.skipLabel.TabIndex = 23;
209 | this.skipLabel.Text = "PixelsToSkipPerCoordinate";
210 | //
211 | // scanDepthTrackBar
212 | //
213 | this.scanDepthTrackBar.Location = new System.Drawing.Point(12, 186);
214 | this.scanDepthTrackBar.Maximum = 200;
215 | this.scanDepthTrackBar.Minimum = 1;
216 | this.scanDepthTrackBar.Name = "scanDepthTrackBar";
217 | this.scanDepthTrackBar.Size = new System.Drawing.Size(284, 45);
218 | this.scanDepthTrackBar.TabIndex = 24;
219 | this.scanDepthTrackBar.Value = 1;
220 | this.scanDepthTrackBar.Scroll += new System.EventHandler(this.trackBar2_ValueChanged);
221 | this.scanDepthTrackBar.ValueChanged += new System.EventHandler(this.trackBar2_ValueChanged);
222 | //
223 | // scanDepthValueLabel
224 | //
225 | this.scanDepthValueLabel.AutoSize = true;
226 | this.scanDepthValueLabel.Location = new System.Drawing.Point(79, 170);
227 | this.scanDepthValueLabel.Name = "scanDepthValueLabel";
228 | this.scanDepthValueLabel.Size = new System.Drawing.Size(97, 13);
229 | this.scanDepthValueLabel.TabIndex = 25;
230 | this.scanDepthValueLabel.Text = "ScanDepth value";
231 | //
232 | // SkipTrackbar
233 | //
234 | this.SkipTrackbar.Location = new System.Drawing.Point(12, 250);
235 | this.SkipTrackbar.Maximum = 200;
236 | this.SkipTrackbar.Minimum = 1;
237 | this.SkipTrackbar.Name = "SkipTrackbar";
238 | this.SkipTrackbar.Size = new System.Drawing.Size(284, 45);
239 | this.SkipTrackbar.TabIndex = 26;
240 | this.SkipTrackbar.Value = 1;
241 | this.SkipTrackbar.Scroll += new System.EventHandler(this.trackBar3_ValueChanged);
242 | this.SkipTrackbar.ValueChanged += new System.EventHandler(this.trackBar3_ValueChanged);
243 | //
244 | // skipValueLabel
245 | //
246 | this.skipValueLabel.AutoSize = true;
247 | this.skipValueLabel.Location = new System.Drawing.Point(175, 234);
248 | this.skipValueLabel.Name = "skipValueLabel";
249 | this.skipValueLabel.Size = new System.Drawing.Size(67, 13);
250 | this.skipValueLabel.TabIndex = 27;
251 | this.skipValueLabel.Text = "Skip value";
252 | //
253 | // listBox1
254 | //
255 | this.listBox1.FormattingEnabled = true;
256 | this.listBox1.Location = new System.Drawing.Point(12, 426);
257 | this.listBox1.Name = "listBox1";
258 | this.listBox1.Size = new System.Drawing.Size(281, 69);
259 | this.listBox1.TabIndex = 28;
260 | this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
261 | //
262 | // portEnabledCheckbox
263 | //
264 | this.portEnabledCheckbox.AutoSize = true;
265 | this.portEnabledCheckbox.Location = new System.Drawing.Point(12, 502);
266 | this.portEnabledCheckbox.Name = "portEnabledCheckbox";
267 | this.portEnabledCheckbox.Size = new System.Drawing.Size(92, 17);
268 | this.portEnabledCheckbox.TabIndex = 29;
269 | this.portEnabledCheckbox.Text = "Enable port";
270 | this.portEnabledCheckbox.UseVisualStyleBackColor = true;
271 | this.portEnabledCheckbox.CheckedChanged += new System.EventHandler(this.portEnabledCheckbox_CheckedChanged);
272 | //
273 | // portsLabel
274 | //
275 | this.portsLabel.AutoSize = true;
276 | this.portsLabel.Location = new System.Drawing.Point(12, 393);
277 | this.portsLabel.Name = "portsLabel";
278 | this.portsLabel.Size = new System.Drawing.Size(37, 13);
279 | this.portsLabel.TabIndex = 30;
280 | this.portsLabel.Text = "Ports";
281 | //
282 | // delayValueLabel
283 | //
284 | this.delayValueLabel.AutoSize = true;
285 | this.delayValueLabel.Location = new System.Drawing.Point(55, 294);
286 | this.delayValueLabel.Name = "delayValueLabel";
287 | this.delayValueLabel.Size = new System.Drawing.Size(73, 13);
288 | this.delayValueLabel.TabIndex = 33;
289 | this.delayValueLabel.Text = "Delay value";
290 | //
291 | // delayTrackbar
292 | //
293 | this.delayTrackbar.Location = new System.Drawing.Point(12, 310);
294 | this.delayTrackbar.Maximum = 1000;
295 | this.delayTrackbar.Name = "delayTrackbar";
296 | this.delayTrackbar.Size = new System.Drawing.Size(284, 45);
297 | this.delayTrackbar.TabIndex = 32;
298 | this.delayTrackbar.Value = 1;
299 | this.delayTrackbar.ValueChanged += new System.EventHandler(this.delayTrackbar_ValueChanged);
300 | //
301 | // delayLabel
302 | //
303 | this.delayLabel.AutoSize = true;
304 | this.delayLabel.Location = new System.Drawing.Point(12, 294);
305 | this.delayLabel.Name = "delayLabel";
306 | this.delayLabel.Size = new System.Drawing.Size(37, 13);
307 | this.delayLabel.TabIndex = 31;
308 | this.delayLabel.Text = "Delay";
309 | //
310 | // previewCheckbox
311 | //
312 | this.previewCheckbox.AutoSize = true;
313 | this.previewCheckbox.Location = new System.Drawing.Point(15, 62);
314 | this.previewCheckbox.Name = "previewCheckbox";
315 | this.previewCheckbox.Size = new System.Drawing.Size(146, 17);
316 | this.previewCheckbox.TabIndex = 34;
317 | this.previewCheckbox.Text = "Color preview (BETA)";
318 | this.previewCheckbox.UseVisualStyleBackColor = true;
319 | this.previewCheckbox.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged_1);
320 | //
321 | // previewImage
322 | //
323 | this.previewImage.Location = new System.Drawing.Point(322, 38);
324 | this.previewImage.Name = "previewImage";
325 | this.previewImage.Size = new System.Drawing.Size(200, 120);
326 | this.previewImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
327 | this.previewImage.TabIndex = 35;
328 | this.previewImage.TabStop = false;
329 | //
330 | // idleTrackbar
331 | //
332 | this.idleTrackbar.Location = new System.Drawing.Point(12, 375);
333 | this.idleTrackbar.Maximum = 2000;
334 | this.idleTrackbar.Minimum = 20;
335 | this.idleTrackbar.Name = "idleTrackbar";
336 | this.idleTrackbar.Size = new System.Drawing.Size(281, 45);
337 | this.idleTrackbar.TabIndex = 36;
338 | this.idleTrackbar.Value = 1000;
339 | this.idleTrackbar.Scroll += new System.EventHandler(this.idleTrackbar_Scroll);
340 | //
341 | // idleLabel
342 | //
343 | this.idleLabel.AutoSize = true;
344 | this.idleLabel.Location = new System.Drawing.Point(15, 356);
345 | this.idleLabel.Name = "idleLabel";
346 | this.idleLabel.Size = new System.Drawing.Size(85, 13);
347 | this.idleLabel.TabIndex = 37;
348 | this.idleLabel.Text = "Frame timeout";
349 | //
350 | // idleValueLabel
351 | //
352 | this.idleValueLabel.AutoSize = true;
353 | this.idleValueLabel.Location = new System.Drawing.Point(106, 356);
354 | this.idleValueLabel.Name = "idleValueLabel";
355 | this.idleValueLabel.Size = new System.Drawing.Size(121, 13);
356 | this.idleValueLabel.TabIndex = 38;
357 | this.idleValueLabel.Text = "Frame timeout value";
358 | //
359 | // label3
360 | //
361 | this.label3.AutoSize = true;
362 | this.label3.Location = new System.Drawing.Point(322, 161);
363 | this.label3.Name = "label3";
364 | this.label3.Size = new System.Drawing.Size(205, 13);
365 | this.label3.TabIndex = 41;
366 | this.label3.Text = "!It will randomly freeze the app!";
367 | //
368 | // label4
369 | //
370 | this.label4.AutoSize = true;
371 | this.label4.Location = new System.Drawing.Point(322, 22);
372 | this.label4.Name = "label4";
373 | this.label4.Size = new System.Drawing.Size(205, 13);
374 | this.label4.TabIndex = 42;
375 | this.label4.Text = "!Use this only to test your leds!";
376 | //
377 | // Form1
378 | //
379 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
380 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
381 | this.ClientSize = new System.Drawing.Size(313, 578);
382 | this.Controls.Add(this.label4);
383 | this.Controls.Add(this.label3);
384 | this.Controls.Add(this.idleValueLabel);
385 | this.Controls.Add(this.idleLabel);
386 | this.Controls.Add(this.idleTrackbar);
387 | this.Controls.Add(this.previewImage);
388 | this.Controls.Add(this.previewCheckbox);
389 | this.Controls.Add(this.delayValueLabel);
390 | this.Controls.Add(this.delayTrackbar);
391 | this.Controls.Add(this.delayLabel);
392 | this.Controls.Add(this.portsLabel);
393 | this.Controls.Add(this.portEnabledCheckbox);
394 | this.Controls.Add(this.listBox1);
395 | this.Controls.Add(this.skipValueLabel);
396 | this.Controls.Add(this.SkipTrackbar);
397 | this.Controls.Add(this.scanDepthValueLabel);
398 | this.Controls.Add(this.scanDepthTrackBar);
399 | this.Controls.Add(this.skipLabel);
400 | this.Controls.Add(this.multiThreadingCheckBox);
401 | this.Controls.Add(this.gammaLabel);
402 | this.Controls.Add(this.gammaTrackBar);
403 | this.Controls.Add(this.scanDepthLabel);
404 | this.Controls.Add(this.hideButton);
405 | this.Controls.Add(this.aboutLabel);
406 | this.Controls.Add(this.gammaValueLabel);
407 | this.Controls.Add(this.cpuLabel);
408 | this.Controls.Add(this.fpsLabel);
409 | this.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
410 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
411 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
412 | this.MaximizeBox = false;
413 | this.MinimizeBox = false;
414 | this.Name = "Form1";
415 | this.ShowInTaskbar = false;
416 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
417 | this.Text = "HueLight+";
418 | this.TopMost = true;
419 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
420 | this.Shown += new System.EventHandler(this.Form1_Shown);
421 | this.contextMenuStrip1.ResumeLayout(false);
422 | ((System.ComponentModel.ISupportInitialize)(this.gammaTrackBar)).EndInit();
423 | ((System.ComponentModel.ISupportInitialize)(this.scanDepthTrackBar)).EndInit();
424 | ((System.ComponentModel.ISupportInitialize)(this.SkipTrackbar)).EndInit();
425 | ((System.ComponentModel.ISupportInitialize)(this.delayTrackbar)).EndInit();
426 | ((System.ComponentModel.ISupportInitialize)(this.previewImage)).EndInit();
427 | ((System.ComponentModel.ISupportInitialize)(this.idleTrackbar)).EndInit();
428 | this.ResumeLayout(false);
429 | this.PerformLayout();
430 |
431 | }
432 |
433 | #endregion
434 | private System.Windows.Forms.Label gammaValueLabel;
435 | private System.Windows.Forms.Label cpuLabel;
436 | private System.Windows.Forms.Label fpsLabel;
437 | private System.Windows.Forms.Button hideButton;
438 | private System.Windows.Forms.Label aboutLabel;
439 | private System.Windows.Forms.NotifyIcon notifyIcon1;
440 | private System.Windows.Forms.Timer timer1;
441 | private System.Windows.Forms.Label scanDepthLabel;
442 | private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
443 | private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
444 | private System.Windows.Forms.TrackBar gammaTrackBar;
445 | private System.Windows.Forms.Label gammaLabel;
446 | private System.Windows.Forms.Timer timer2;
447 | private System.Windows.Forms.CheckBox multiThreadingCheckBox;
448 | private System.Windows.Forms.Label skipLabel;
449 | private System.Windows.Forms.TrackBar scanDepthTrackBar;
450 | private System.Windows.Forms.Label scanDepthValueLabel;
451 | private System.Windows.Forms.TrackBar SkipTrackbar;
452 | private System.Windows.Forms.Label skipValueLabel;
453 | private System.Windows.Forms.ListBox listBox1;
454 | private System.Windows.Forms.CheckBox portEnabledCheckbox;
455 | private System.Windows.Forms.Label portsLabel;
456 | private System.Windows.Forms.ToolStripMenuItem hideToolStripMenuItem;
457 | private System.Windows.Forms.Label delayValueLabel;
458 | private System.Windows.Forms.TrackBar delayTrackbar;
459 | private System.Windows.Forms.Label delayLabel;
460 | private System.Windows.Forms.CheckBox previewCheckbox;
461 | private System.Windows.Forms.PictureBox previewImage;
462 | private System.Windows.Forms.TrackBar idleTrackbar;
463 | private System.Windows.Forms.Label idleLabel;
464 | private System.Windows.Forms.Label idleValueLabel;
465 | private System.Windows.Forms.Label label3;
466 | private System.Windows.Forms.Label label4;
467 | }
468 | }
469 |
470 |
--------------------------------------------------------------------------------
/HueLight+/Form1.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 17, 17
122 |
123 |
124 | 217, 17
125 |
126 |
127 |
128 |
129 | AAABAAEAQEAAAAEAIAAoQAAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
130 | AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
131 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
132 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
133 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
134 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
135 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
136 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
137 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
138 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA
139 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
140 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
141 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
142 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA
143 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
144 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
145 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
146 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
147 | AP8AAAD/AAAA/wAAAP8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
148 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
149 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
150 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
151 | //8AAP//AAD//wAA//8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
152 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
153 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
154 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
155 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA//8AAP//AAD//wAA
156 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
157 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
158 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
159 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAAP8AAAD/AAAA/wAA
160 | AP8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
161 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
162 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
163 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
164 | //8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
165 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
166 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
167 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
168 | //8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
169 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
170 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
171 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
172 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp
173 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
174 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
175 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
176 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAA
177 | AP8AAAD/AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
178 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
179 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
180 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
181 | //8Aqf//AAAA/wAAAP8AAAD/AAAA/wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
182 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
183 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
184 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
185 | //8Aqf//AKn//wCp//8Aqf//AKn//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp
186 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
187 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
188 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
189 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AKn//wCp
190 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
191 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
192 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
193 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AAAA/wAA
194 | AP8AAAD/AAAA/wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
195 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
196 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
197 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
198 | //8Aqf//AKn//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
199 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
200 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
201 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
202 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AKn//wCp//8Aqf//AKn//wCp
203 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
204 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
205 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
206 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AAAA/wAAAP8AAAD/AAAA/wCp
207 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
208 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
209 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
210 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wAA
211 | AP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
212 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
213 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
214 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
215 | //8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD/
216 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
217 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
218 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
219 | //8A////AP///wD///8A////AP///wD///8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD/
220 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
221 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
222 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
223 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAA
224 | AP8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
225 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
226 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
227 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
228 | //8AAAD/AAAA/wAAAP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
229 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
230 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
231 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
232 | //8A////AP///wD///8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD///8A////AP///wD/
233 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
234 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
235 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
236 | //8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAAAP8A////AP///wD/
237 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
238 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
239 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
240 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/AAAA/wAA
241 | AP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
242 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
243 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
244 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
245 | //8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
246 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
247 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
248 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
249 | //8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAAAP8A////AP///wD///8A////AP///wD/
250 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
251 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
252 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
253 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/AAAA/wAAAP8AAAD/AP///wD/
254 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
255 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
256 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
257 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA/wAA
258 | AP8AAAD/AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
259 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
260 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
261 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
262 | AP8A/wD/AP8A/wAAAP8AAAD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
263 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
264 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
265 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
266 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/
267 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
268 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
269 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
270 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA/wD/
271 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
272 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
273 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
274 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAA
275 | AP8AAAD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
276 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
277 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
278 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
279 | AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
280 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
281 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
282 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
283 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA/wD/AP8A/wD/AP8A/wD/
284 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
285 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
286 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
287 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAP8AAAD/AAAA/wAA
288 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
289 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
290 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
291 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
292 | AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
293 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
294 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
295 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
296 | AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
297 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
298 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
299 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
300 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8A
301 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
302 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
303 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
304 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAA
305 | AP8AAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
306 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
307 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
308 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
309 | AP//AAD/AAAA/wAAAP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
310 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
311 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
312 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
313 | AP//AAD//wAA//8AAP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8AAP//AAD//wAA//8A
314 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
315 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
316 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
317 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAAAP8AAAD//wAA//8A
318 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
319 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
320 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
321 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/AAAA/wAA
322 | AP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
323 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
324 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
325 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
326 | AP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
327 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
328 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
329 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
330 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAAAP8AAAD//wAA//8AAP//AAD//wAA//8A
331 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
332 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
333 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
334 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/AAAA/wAAAP8AAAD/AAAA//8A
335 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
336 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
337 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
338 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAA
339 | AP8AAAD/AAAA/wAAAP//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
340 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
341 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
342 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
343 | lv//AJb//wCW//8Alv8AAAD/AAAA/wAAAP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
344 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
345 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
346 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
347 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb/AAAA/wAAAP8AAAD/AAAA//8Alv//AJb//wCW//8A
348 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
349 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
350 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
351 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAAAP8AAAD/AAAA/wAA
352 | AP//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
353 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
354 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
355 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
356 | lv8AAAD/AAAA/wAAAP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
357 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
358 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
359 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
360 | lv//AJb//wCW//8Alv//AJb/AAAA/wAAAP8AAAD/AAAA//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
361 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
362 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
363 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
364 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAAAP8AAAD/AAAA/wAAAP//AJb//wCW//8A
365 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
366 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
367 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
368 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv8AAAD/AAAA/wAA
369 | AP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
370 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
371 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
372 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
373 | lv//AJb/AAAA/wAAAP8AAAD/AAAA//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
374 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
375 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
376 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
377 | ////AP///wD///8A////AP///wD//wAAAP8AAAD/AAAA/wAAAP//AP///wD///8A////AP///wD///8A
378 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
379 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
380 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
381 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAAD/AAAA/wAAAP8AAAD//wD///8A
382 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
383 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
384 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
385 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//AAAA/wAA
386 | AP8AAAD/AAAA//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
387 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
388 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
389 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
390 | ////AP///wD//wAAAP8AAAD/AAAA/wAAAP//AP///wD///8A////AP///wD///8A////AP///wD///8A
391 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
392 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
393 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
394 | ////AP///wD///8A////AP///wD///8A//8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
395 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
396 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
397 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
398 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
399 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
400 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
401 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
402 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
403 | AP8AAAD/
404 |
405 |
406 |
407 | 130, 17
408 |
409 |
410 | 372, 17
411 |
412 |
413 |
414 | AAABAAEAQEAAAAEAIAAoQAAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
415 | AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
416 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
417 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
418 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
419 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
420 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
421 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
422 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
423 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA
424 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
425 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
426 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
427 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA
428 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
429 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
430 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
431 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
432 | AP8AAAD/AAAA/wAAAP8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
433 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
434 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
435 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
436 | //8AAP//AAD//wAA//8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
437 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
438 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
439 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
440 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA//8AAP//AAD//wAA
441 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
442 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
443 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
444 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAAP8AAAD/AAAA/wAA
445 | AP8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
446 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
447 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
448 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
449 | //8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
450 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
451 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
452 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
453 | //8AAP//AAD//wAA//8AAP//AAAA/wAAAP8AAAD/AAAA/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
454 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
455 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
456 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA
457 | //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp
458 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
459 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
460 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
461 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAA
462 | AP8AAAD/AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
463 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
464 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
465 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
466 | //8Aqf//AAAA/wAAAP8AAAD/AAAA/wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
467 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
468 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
469 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
470 | //8Aqf//AKn//wCp//8Aqf//AKn//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp
471 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
472 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
473 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
474 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AKn//wCp
475 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
476 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
477 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
478 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AAAA/wAA
479 | AP8AAAD/AAAA/wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
480 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
481 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
482 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
483 | //8Aqf//AKn//wAAAP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
484 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
485 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
486 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
487 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AKn//wCp//8Aqf//AKn//wCp
488 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
489 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
490 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
491 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AAAA/wAAAP8AAAD/AAAA/wCp
492 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
493 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
494 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
495 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wAA
496 | AP8AAAD/AAAA/wAAAP8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
497 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
498 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
499 | //8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp//8Aqf//AKn//wCp
500 | //8Aqf//AKn//wCp//8AAAD/AAAA/wAAAP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD/
501 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
502 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
503 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
504 | //8A////AP///wD///8A////AP///wD///8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD/
505 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
506 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
507 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
508 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAA
509 | AP8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
510 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
511 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
512 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
513 | //8AAAD/AAAA/wAAAP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
514 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
515 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
516 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
517 | //8A////AP///wD///8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD///8A////AP///wD/
518 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
519 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
520 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
521 | //8A////AP///wD///8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAAAP8A////AP///wD/
522 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
523 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
524 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
525 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/AAAA/wAA
526 | AP8AAAD/AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
527 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
528 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
529 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
530 | //8A////AAAA/wAAAP8AAAD/AAAA/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
531 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
532 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
533 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
534 | //8A////AP///wD///8A////AP///wAAAP8AAAD/AAAA/wAAAP8A////AP///wD///8A////AP///wD/
535 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
536 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
537 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
538 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAD/AAAA/wAAAP8AAAD/AP///wD/
539 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
540 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
541 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD/
542 | //8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA/wAA
543 | AP8AAAD/AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
544 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
545 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
546 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
547 | AP8A/wD/AP8A/wAAAP8AAAD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
548 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
549 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
550 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
551 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/
552 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
553 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
554 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
555 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA/wD/
556 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
557 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
558 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
559 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAA
560 | AP8AAAD/AAAA/wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
561 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
562 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
563 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
564 | AP8A/wD/AP8A/wD/AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
565 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
566 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
567 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
568 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA/wD/AP8A/wD/AP8A/wD/
569 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
570 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
571 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
572 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAP8AAAD/AAAA/wAA
573 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
574 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
575 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
576 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
577 | AP8AAAD/AAAA/wAAAP8AAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
578 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
579 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
580 | AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
581 | AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
582 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
583 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
584 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
585 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8A
586 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
587 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
588 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
589 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAA
590 | AP8AAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
591 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
592 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
593 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
594 | AP//AAD/AAAA/wAAAP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
595 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
596 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
597 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
598 | AP//AAD//wAA//8AAP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8AAP//AAD//wAA//8A
599 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
600 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
601 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
602 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAAAP8AAAD//wAA//8A
603 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
604 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
605 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
606 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/AAAA/wAA
607 | AP8AAAD/AAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
608 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
609 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
610 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
611 | AP//AAD//wAA/wAAAP8AAAD/AAAA/wAAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
612 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
613 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
614 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
615 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP8AAAD/AAAA/wAAAP8AAAD//wAA//8AAP//AAD//wAA//8A
616 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
617 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
618 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8A
619 | AP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/AAAA/wAAAP8AAAD/AAAA//8A
620 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
621 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
622 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
623 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAA
624 | AP8AAAD/AAAA/wAAAP//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
625 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
626 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
627 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
628 | lv//AJb//wCW//8Alv8AAAD/AAAA/wAAAP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
629 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
630 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
631 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
632 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb/AAAA/wAAAP8AAAD/AAAA//8Alv//AJb//wCW//8A
633 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
634 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
635 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
636 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAAAP8AAAD/AAAA/wAA
637 | AP//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
638 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
639 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
640 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
641 | lv8AAAD/AAAA/wAAAP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
642 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
643 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
644 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
645 | lv//AJb//wCW//8Alv//AJb/AAAA/wAAAP8AAAD/AAAA//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
646 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
647 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
648 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
649 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW/wAAAP8AAAD/AAAA/wAAAP//AJb//wCW//8A
650 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
651 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
652 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
653 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv8AAAD/AAAA/wAA
654 | AP8AAAD//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
655 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
656 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
657 | lv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8Alv//AJb//wCW//8A
658 | lv//AJb/AAAA/wAAAP8AAAD/AAAA//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
659 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
660 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
661 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
662 | ////AP///wD///8A////AP///wD//wAAAP8AAAD/AAAA/wAAAP//AP///wD///8A////AP///wD///8A
663 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
664 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
665 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
666 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAAD/AAAA/wAAAP8AAAD//wD///8A
667 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
668 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
669 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
670 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//AAAA/wAA
671 | AP8AAAD/AAAA//8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
672 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
673 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
674 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
675 | ////AP///wD//wAAAP8AAAD/AAAA/wAAAP//AP///wD///8A////AP///wD///8A////AP///wD///8A
676 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
677 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
678 | ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
679 | ////AP///wD///8A////AP///wD///8A//8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
680 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
681 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
682 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
683 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
684 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
685 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
686 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
687 | AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
688 | AP8AAAD/
689 |
690 |
691 |
--------------------------------------------------------------------------------