[mapguide-commits] r5323 - in sandbox/maestro-3.0: Maestro Maestro.Base Maestro.Base/Commands Maestro.Base/Editor Maestro.Base/Events Maestro.Base/Properties Maestro.Editors Maestro.Editors/Diagnostics Maestro.Editors/Properties Maestro.Login MaestroAPITests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Capability OSGeo.MapGuide.MaestroAPI/Commands OSGeo.MapGuide.MaestroAPI/Services OSGeo.MapGuide.MaestroAPI.Http OSGeo.MapGuide.MaestroAPI.Native OSGeo.MapGuide.MaestroAPI.Native/Properties

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Oct 25 02:57:06 EDT 2010


Author: jng
Date: 2010-10-24 23:57:06 -0700 (Sun, 24 Oct 2010)
New Revision: 5323

Added:
   sandbox/maestro-3.0/Maestro.Base/Commands/ServerMonitorCommand.cs
   sandbox/maestro-3.0/Maestro.Editors/Diagnostics/
   sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.cs
   sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.resx
   sandbox/maestro-3.0/Maestro/App.config
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ISiteService.cs
Removed:
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Mapping/
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo-2.2.0.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/GetCapabilities.cs
Modified:
   sandbox/maestro-3.0/Maestro.Base/Editor/EditorContentBase.cs
   sandbox/maestro-3.0/Maestro.Base/Events/EventWatcher.cs
   sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin
   sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj
   sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs
   sandbox/maestro-3.0/Maestro/Maestro.csproj
   sandbox/maestro-3.0/Maestro/Maestro.sln
   sandbox/maestro-3.0/MaestroAPITests/CapabilityTests.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeCapabilities.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ServiceType.cs
Log:
3.0 sandbox changes:
 - Port over server status monitor from 2.x
 - Add new ISiteService interface for site operations
 - Change IConnectionCapabilities.SupportsResourcePreviews to IConnectionCapabilities.SupportsResourcePreviewUrls for clarification
 - Remove unused commands as these are already implemented at the server connection level
 - Re-include official MapGuide API implementation of IServerConnection
 - Update Capabilities API so that HTTP and LocalNative implementations inherit from a base capabilities class
 - Add additional logic to disable TCP/IP option if (running on Mono -OR- Maestro.LocalNative provider not found)
 - Fix incorrect connection parameter being used when using LocalNative mode from Login Dialog
 - Add app.config to Maestro project with a sample config for MapGuideDotNetApi binding redirection
 - Disable Maestro.LocalNative entry in ConnectionProviders.xml by default as this requires additional setup, documentation will be available for those who wish to utilise this connection provider


Added: sandbox/maestro-3.0/Maestro/App.config
===================================================================
--- sandbox/maestro-3.0/Maestro/App.config	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro/App.config	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <!-- 
+    If you use the Local Native Connection, setup assembly binding redirection by
+    editing this file here. For more information, visit the following links:
+    
+    http://trac.osgeo.org/mapguide/wiki/maestro/MaestroAPI/MapGuideDotNetApiVersions
+    
+    http://themapguyde.blogspot.com/2010/10/using-maestro-in-native-mode-with.html
+    
+    The example below (commented out) sets up MapGuideDotNetApi to redirect to 2.2
+    version of the official MapGuide dlls assuming the instructions in the 2nd link
+    were carried out.
+    
+    Note that Local Native Connection is not available for Mono.
+    -->
+    <!--
+    <runtime>
+        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+            <dependentAssembly>
+                <assemblyIdentity name="MapGuideDotNetApi" publicKeyToken="f526c48929fda856" />
+
+                <codeBase version="1.0.0.1" href="MapGuideDotNetApi-2.2.dll"/>
+                
+                <bindingRedirect oldVersion="2.0.0.2308" newVersion="1.0.0.1" />
+
+            </dependentAssembly>
+        </assemblyBinding>
+    </runtime>
+    -->
+</configuration>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro/Maestro.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro/Maestro.csproj	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro/Maestro.csproj	2010-10-25 06:57:06 UTC (rev 5323)
@@ -58,6 +58,7 @@
       <DependentUpon>Resources.resx</DependentUpon>
       <DesignTime>True</DesignTime>
     </Compile>
+    <None Include="App.config" />
     <None Include="Maestro.sh">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
@@ -731,6 +732,10 @@
       <Project>{6EF1E775-444B-4E5F-87FB-D687C43A68D7}</Project>
       <Name>OSGeo.MapGuide.MaestroAPI.Http</Name>
     </ProjectReference>
+    <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI.Native\OSGeo.MapGuide.MaestroAPI.Native.csproj">
+      <Project>{F4420153-9DF3-4407-AD65-E8ABED2B6E25}</Project>
+      <Name>OSGeo.MapGuide.MaestroAPI.Native</Name>
+    </ProjectReference>
     <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
       <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
       <Name>OSGeo.MapGuide.MaestroAPI</Name>

Modified: sandbox/maestro-3.0/Maestro/Maestro.sln
===================================================================
--- sandbox/maestro-3.0/Maestro/Maestro.sln	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro/Maestro.sln	2010-10-25 06:57:06 UTC (rev 5323)
@@ -57,6 +57,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MgCooker.Cmd", "..\MgCooker.Cmd\MgCooker.Cmd.csproj", "{0FD82B7B-1264-410F-86D1-47E9CCACD68E}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OSGeo.MapGuide.MaestroAPI.Native", "..\OSGeo.MapGuide.MaestroAPI.Native\OSGeo.MapGuide.MaestroAPI.Native.csproj", "{F4420153-9DF3-4407-AD65-E8ABED2B6E25}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -159,6 +161,10 @@
 		{0FD82B7B-1264-410F-86D1-47E9CCACD68E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0FD82B7B-1264-410F-86D1-47E9CCACD68E}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0FD82B7B-1264-410F-86D1-47E9CCACD68E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F4420153-9DF3-4407-AD65-E8ABED2B6E25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F4420153-9DF3-4407-AD65-E8ABED2B6E25}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F4420153-9DF3-4407-AD65-E8ABED2B6E25}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F4420153-9DF3-4407-AD65-E8ABED2B6E25}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

Added: sandbox/maestro-3.0/Maestro.Base/Commands/ServerMonitorCommand.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Commands/ServerMonitorCommand.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Base/Commands/ServerMonitorCommand.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,44 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using ICSharpCode.Core;
+using Maestro.Base.Services;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using Maestro.Editors.Diagnostics;
+
+namespace Maestro.Base.Commands
+{
+    internal class ServerMonitorCommand : AbstractMenuCommand
+    {
+        public override void Run()
+        {
+            try
+            {
+                ServerStatusMonitor.ShowWindow();
+            }
+            catch (Exception ex)
+            {
+                MessageService.ShowError(ex.Message);
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/Maestro.Base/Editor/EditorContentBase.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/EditorContentBase.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/EditorContentBase.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -192,7 +192,7 @@
                 if (res != null)
                 {
                     var rt = res.ResourceType;
-                    return ResourcePreviewEngine.IsPreviewableType(rt) && res.CurrentConnection.Capabilities.SupportsResourcePreviews;                    
+                    return ResourcePreviewEngine.IsPreviewableType(rt) && res.CurrentConnection.Capabilities.SupportsResourcePreviewUrls;                    
                 }
                 return false;
             }

Modified: sandbox/maestro-3.0/Maestro.Base/Events/EventWatcher.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Events/EventWatcher.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Events/EventWatcher.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -23,6 +23,8 @@
 using Maestro.Base.Services;
 using System.Diagnostics;
 using Maestro.Base.UI;
+using Maestro.Editors.Diagnostics;
+using OSGeo.MapGuide.MaestroAPI.Services;
 
 namespace Maestro.Base.Events
 {
@@ -44,6 +46,10 @@
             Debug.Assert(wb.ActiveSiteExplorer.ConnectionName == name);
 
             wb.ActiveSiteExplorer = null;
+
+            //TODO: Review this API design when we do decide to support multiple
+            //site connections
+            ServerStatusMonitor.Init(null);
         }
 
         static void OnConnectionAdded(object sender, string name)
@@ -51,7 +57,19 @@
             var exp = new SiteExplorer(name);
             var wb = Workbench.Instance;
             wb.ShowContent(exp);
+
+            var svc = ServiceRegistry.GetService<ServerConnectionManager>();
+            var conn = svc.GetConnection(name);
             
+            ISiteService siteSvc = null;
+            var svcTypes = conn.Capabilities.SupportedServices;
+            if (Array.IndexOf(svcTypes, (int)ServiceType.Site) >= 0)
+            {
+                siteSvc = (ISiteService)conn.GetService((int)ServiceType.Site);
+            }
+            //TODO: Review this API design when we do decide to support multiple
+            //site connections
+            ServerStatusMonitor.Init(siteSvc);
         }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.addin	2010-10-25 06:57:06 UTC (rev 5323)
@@ -150,6 +150,9 @@
             <MenuItem id="LocalFsPreview"
                       label="${res:LocalFsPreview}"
                       class="Maestro.Base.Commands.LocalFeatureSourcePreviewCommand"/>
+            <MenuItem id="ServerMonitor"
+                      label="${res:ServerMonitor}"
+                      class="Maestro.Base.Commands.ServerMonitorCommand"/>
             <MenuItem type="Separator" />
             <MenuItem id="Menu_Tools_Options"
                       label="${res:Menu_Tools_Options}"

Modified: sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Maestro.Base.csproj	2010-10-25 06:57:06 UTC (rev 5323)
@@ -72,6 +72,7 @@
     <Compile Include="Commands\QuitCommand.cs" />
     <Compile Include="Commands\SaveResourceAsCommand.cs" />
     <Compile Include="Commands\SaveResourceCommand.cs" />
+    <Compile Include="Commands\ServerMonitorCommand.cs" />
     <Compile Include="Commands\SiteExplorer\DeleteSelectedItemsCommand.cs" />
     <Compile Include="Commands\SiteExplorer\DisconnectCommand.cs" />
     <Compile Include="Commands\SiteExplorer\MigrateSelectedResourcesCommand.cs" />

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.Designer.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1206,6 +1206,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Server Status Monitor.
+        /// </summary>
+        internal static string ServerMonitor {
+            get {
+                return ResourceManager.GetString("ServerMonitor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Initialized: Open Resource Manager.
         /// </summary>
         internal static string Service_Init_Open_Resource_Manager {

Modified: sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Base/Properties/Resources.resx	2010-10-25 06:57:06 UTC (rev 5323)
@@ -757,4 +757,7 @@
   <data name="LocateExecutable" xml:space="preserve">
     <value>Locate executable: {0}</value>
   </data>
+  <data name="ServerMonitor" xml:space="preserve">
+    <value>Server Status Monitor</value>
+  </data>
 </root>
\ No newline at end of file

Copied: sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.cs (from rev 5244, trunk/Tools/Maestro/Maestro/ServerStatusMonitor.cs)
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,140 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI;
+using System.Globalization;
+using OSGeo.MapGuide.MaestroAPI.Services;
+
+namespace Maestro.Editors.Diagnostics
+{
+    public partial class ServerStatusMonitor : Form
+    {
+        private ServerStatusMonitor()
+        {
+            InitializeComponent();
+        }
+
+        private void ServerStatusMonitor_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            e.Cancel = true;
+            ServerStatusMonitor.HideWindow();
+        }
+
+        private void StartTimer() { pollTimer.Start(); }
+
+        private void StopTimer() { pollTimer.Stop(); }
+
+        public static void Init(ISiteService conn)
+        {
+            _smConn = conn;
+
+            if (_smMonitor != null)
+                _smMonitor.Dispose();
+
+            if (_smConn != null)
+                _smMonitor = new ServerStatusMonitor();
+        }
+
+        private static ISiteService _smConn;
+
+        private static ServerStatusMonitor _smMonitor;
+
+        public static void ShowWindow()
+        {
+            if (_smConn != null)
+            {
+                _smMonitor.DoPoll();
+                _smMonitor.StartTimer();
+                _smMonitor.Show();
+            }
+            else
+            {
+                throw new InvalidOperationException(Properties.Resources.NoSiteService);
+            }
+        }
+
+        public static void HideWindow()
+        {
+            _smMonitor.StopTimer();
+            _smMonitor.Hide();
+        }
+
+        private void pollTimer_Tick(object sender, EventArgs e)
+        {
+            DoPoll();
+        }
+
+        private static string ParseMs(string value)
+        {
+            return value + " " + Properties.Resources.UnitsMs;
+        }
+
+        private static string ParseSeconds(string value)
+        {
+            return value + " " + Properties.Resources.UnitsSeconds;
+        }
+
+        private static string ParseKb(string valueBytes)
+        {
+            double d;
+            if (double.TryParse(valueBytes, 
+                                NumberStyles.AllowThousands, 
+                                System.Threading.Thread.CurrentThread.CurrentUICulture, 
+                                out d))
+            {
+                return (d / 1000.0).ToString(System.Threading.Thread.CurrentThread.CurrentUICulture) + " " + Properties.Resources.UnitsKb;
+            }
+            return valueBytes;
+        }
+
+        private void DoPoll()
+        {
+            var info = _smConn.GetSiteInfo();
+
+            lblActiveConnections.Text = info.Statistics.ActiveConnections;
+            lblAdminQueueCount.Text = info.Statistics.AdminOperationsQueueCount;
+            lblAvailPhysMem.Text = ParseKb(info.SiteServer.OperatingSystem.AvailablePhysicalMemory);
+            lblAvgOpTime.Text = info.Statistics.AverageOperationTime;
+            lblClientQueueCount.Text = info.Statistics.ClientOperationsQueueCount;
+            lblCpuUtil.Text = info.Statistics.CpuUtilization;
+            lblOsVersion.Text = info.SiteServer.OperatingSystem.Version;
+            lblPhysMemTotal.Text = ParseKb(info.SiteServer.OperatingSystem.TotalPhysicalMemory);
+            lblServerDisplayName.Text = info.SiteServer.DisplayName;
+            lblServerStatus.Text = info.SiteServer.Status;
+            lblServerVersion.Text = info.SiteServer.Version;
+            lblSiteQueueCount.Text = info.Statistics.SiteOperationsQueueCount;
+            lblTotalConnections.Text = info.Statistics.TotalConnections;
+            lblTotalOpsProcessed.Text = info.Statistics.TotalOperationsProcessed;
+            lblTotalOpsReceived.Text = info.Statistics.TotalOperationsReceived;
+            lblTotalOpTime.Text = ParseSeconds(info.Statistics.TotalOperationTime);
+            lblUptime.Text = ParseSeconds(info.Statistics.Uptime);
+            lblVirtMemAvail.Text = ParseKb(info.SiteServer.OperatingSystem.AvailableVirtualMemory);
+            lblVirtMemTotal.Text = ParseKb(info.SiteServer.OperatingSystem.TotalVirtualMemory);
+
+            lblLastUpdated.Text = Properties.Resources.LastUpdated + DateTime.Now.ToString(System.Threading.Thread.CurrentThread.CurrentUICulture);
+        }
+    }
+}

Added: sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.designer.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.designer.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,582 @@
+namespace Maestro.Editors.Diagnostics
+{
+    partial class ServerStatusMonitor
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerStatusMonitor));
+            this.pollTimer = new System.Windows.Forms.Timer(this.components);
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.lblLastUpdated = new System.Windows.Forms.ToolStripStatusLabel();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.lblServerDisplayName = new System.Windows.Forms.Label();
+            this.lblServerStatus = new System.Windows.Forms.Label();
+            this.lblServerVersion = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.lblOsVersion = new System.Windows.Forms.Label();
+            this.lblVirtMemTotal = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.lblVirtMemAvail = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.lblPhysMemTotal = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.lblAvailPhysMem = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.lblUptime = new System.Windows.Forms.Label();
+            this.lblCpuUtil = new System.Windows.Forms.Label();
+            this.label25 = new System.Windows.Forms.Label();
+            this.lblTotalOpsReceived = new System.Windows.Forms.Label();
+            this.lblAvgOpTime = new System.Windows.Forms.Label();
+            this.label14 = new System.Windows.Forms.Label();
+            this.lblSiteQueueCount = new System.Windows.Forms.Label();
+            this.label15 = new System.Windows.Forms.Label();
+            this.lblClientQueueCount = new System.Windows.Forms.Label();
+            this.lblTotalOpsProcessed = new System.Windows.Forms.Label();
+            this.lblAdminQueueCount = new System.Windows.Forms.Label();
+            this.label16 = new System.Windows.Forms.Label();
+            this.label17 = new System.Windows.Forms.Label();
+            this.lblTotalConnections = new System.Windows.Forms.Label();
+            this.label18 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.lblActiveConnections = new System.Windows.Forms.Label();
+            this.label10 = new System.Windows.Forms.Label();
+            this.label11 = new System.Windows.Forms.Label();
+            this.lblTotalOpTime = new System.Windows.Forms.Label();
+            this.label12 = new System.Windows.Forms.Label();
+            this.label13 = new System.Windows.Forms.Label();
+            this.statusStrip1.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.groupBox3.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pollTimer
+            // 
+            this.pollTimer.Interval = 5000;
+            this.pollTimer.Tick += new System.EventHandler(this.pollTimer_Tick);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(18, 25);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(84, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Display Name";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label2.Location = new System.Drawing.Point(18, 50);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(43, 13);
+            this.label2.TabIndex = 1;
+            this.label2.Text = "Status";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label3.Location = new System.Drawing.Point(18, 74);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(49, 13);
+            this.label3.TabIndex = 2;
+            this.label3.Text = "Version";
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.lblLastUpdated});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 311);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(620, 22);
+            this.statusStrip1.TabIndex = 3;
+            // 
+            // lblLastUpdated
+            // 
+            this.lblLastUpdated.Name = "lblLastUpdated";
+            this.lblLastUpdated.Size = new System.Drawing.Size(0, 17);
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.lblServerDisplayName);
+            this.groupBox1.Controls.Add(this.lblServerStatus);
+            this.groupBox1.Controls.Add(this.lblServerVersion);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Location = new System.Drawing.Point(12, 12);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(288, 97);
+            this.groupBox1.TabIndex = 4;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Server";
+            // 
+            // lblServerDisplayName
+            // 
+            this.lblServerDisplayName.AutoSize = true;
+            this.lblServerDisplayName.Location = new System.Drawing.Point(162, 25);
+            this.lblServerDisplayName.Name = "lblServerDisplayName";
+            this.lblServerDisplayName.Size = new System.Drawing.Size(0, 13);
+            this.lblServerDisplayName.TabIndex = 3;
+            // 
+            // lblServerStatus
+            // 
+            this.lblServerStatus.AutoSize = true;
+            this.lblServerStatus.Location = new System.Drawing.Point(162, 50);
+            this.lblServerStatus.Name = "lblServerStatus";
+            this.lblServerStatus.Size = new System.Drawing.Size(0, 13);
+            this.lblServerStatus.TabIndex = 4;
+            // 
+            // lblServerVersion
+            // 
+            this.lblServerVersion.AutoSize = true;
+            this.lblServerVersion.Location = new System.Drawing.Point(162, 74);
+            this.lblServerVersion.Name = "lblServerVersion";
+            this.lblServerVersion.Size = new System.Drawing.Size(0, 13);
+            this.lblServerVersion.TabIndex = 5;
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)));
+            this.groupBox2.Controls.Add(this.lblOsVersion);
+            this.groupBox2.Controls.Add(this.lblVirtMemTotal);
+            this.groupBox2.Controls.Add(this.label7);
+            this.groupBox2.Controls.Add(this.lblVirtMemAvail);
+            this.groupBox2.Controls.Add(this.label6);
+            this.groupBox2.Controls.Add(this.lblPhysMemTotal);
+            this.groupBox2.Controls.Add(this.label5);
+            this.groupBox2.Controls.Add(this.lblAvailPhysMem);
+            this.groupBox2.Controls.Add(this.label4);
+            this.groupBox2.Location = new System.Drawing.Point(12, 115);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(288, 181);
+            this.groupBox2.TabIndex = 5;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Operating System";
+            // 
+            // lblOsVersion
+            // 
+            this.lblOsVersion.AutoSize = true;
+            this.lblOsVersion.Location = new System.Drawing.Point(18, 26);
+            this.lblOsVersion.Name = "lblOsVersion";
+            this.lblOsVersion.Size = new System.Drawing.Size(0, 13);
+            this.lblOsVersion.TabIndex = 21;
+            // 
+            // lblVirtMemTotal
+            // 
+            this.lblVirtMemTotal.AutoSize = true;
+            this.lblVirtMemTotal.Location = new System.Drawing.Point(182, 133);
+            this.lblVirtMemTotal.Name = "lblVirtMemTotal";
+            this.lblVirtMemTotal.Size = new System.Drawing.Size(0, 13);
+            this.lblVirtMemTotal.TabIndex = 20;
+            this.lblVirtMemTotal.Tag = "";
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label7.Location = new System.Drawing.Point(18, 133);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(123, 13);
+            this.label7.TabIndex = 15;
+            this.label7.Text = "Total Virtual Memory";
+            // 
+            // lblVirtMemAvail
+            // 
+            this.lblVirtMemAvail.AutoSize = true;
+            this.lblVirtMemAvail.Location = new System.Drawing.Point(182, 110);
+            this.lblVirtMemAvail.Name = "lblVirtMemAvail";
+            this.lblVirtMemAvail.Size = new System.Drawing.Size(0, 13);
+            this.lblVirtMemAvail.TabIndex = 19;
+            this.lblVirtMemAvail.Tag = "";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label6.Location = new System.Drawing.Point(18, 110);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(146, 13);
+            this.label6.TabIndex = 14;
+            this.label6.Text = "Available Virtual Memory";
+            // 
+            // lblPhysMemTotal
+            // 
+            this.lblPhysMemTotal.AutoSize = true;
+            this.lblPhysMemTotal.Location = new System.Drawing.Point(182, 86);
+            this.lblPhysMemTotal.Name = "lblPhysMemTotal";
+            this.lblPhysMemTotal.Size = new System.Drawing.Size(0, 13);
+            this.lblPhysMemTotal.TabIndex = 18;
+            this.lblPhysMemTotal.Tag = "";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label5.Location = new System.Drawing.Point(18, 86);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(134, 13);
+            this.label5.TabIndex = 13;
+            this.label5.Text = "Total Physical Memory";
+            // 
+            // lblAvailPhysMem
+            // 
+            this.lblAvailPhysMem.AutoSize = true;
+            this.lblAvailPhysMem.Location = new System.Drawing.Point(182, 62);
+            this.lblAvailPhysMem.Name = "lblAvailPhysMem";
+            this.lblAvailPhysMem.Size = new System.Drawing.Size(0, 13);
+            this.lblAvailPhysMem.TabIndex = 17;
+            this.lblAvailPhysMem.Tag = "";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label4.Location = new System.Drawing.Point(18, 62);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(157, 13);
+            this.label4.TabIndex = 12;
+            this.label4.Text = "Available Physical Memory";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Controls.Add(this.lblUptime);
+            this.groupBox3.Controls.Add(this.lblCpuUtil);
+            this.groupBox3.Controls.Add(this.label25);
+            this.groupBox3.Controls.Add(this.lblTotalOpsReceived);
+            this.groupBox3.Controls.Add(this.lblAvgOpTime);
+            this.groupBox3.Controls.Add(this.label14);
+            this.groupBox3.Controls.Add(this.lblSiteQueueCount);
+            this.groupBox3.Controls.Add(this.label15);
+            this.groupBox3.Controls.Add(this.lblClientQueueCount);
+            this.groupBox3.Controls.Add(this.lblTotalOpsProcessed);
+            this.groupBox3.Controls.Add(this.lblAdminQueueCount);
+            this.groupBox3.Controls.Add(this.label16);
+            this.groupBox3.Controls.Add(this.label17);
+            this.groupBox3.Controls.Add(this.lblTotalConnections);
+            this.groupBox3.Controls.Add(this.label18);
+            this.groupBox3.Controls.Add(this.label9);
+            this.groupBox3.Controls.Add(this.lblActiveConnections);
+            this.groupBox3.Controls.Add(this.label10);
+            this.groupBox3.Controls.Add(this.label11);
+            this.groupBox3.Controls.Add(this.lblTotalOpTime);
+            this.groupBox3.Controls.Add(this.label12);
+            this.groupBox3.Controls.Add(this.label13);
+            this.groupBox3.Location = new System.Drawing.Point(306, 12);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(302, 284);
+            this.groupBox3.TabIndex = 6;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Statistics";
+            // 
+            // lblUptime
+            // 
+            this.lblUptime.AutoSize = true;
+            this.lblUptime.Location = new System.Drawing.Point(220, 254);
+            this.lblUptime.Name = "lblUptime";
+            this.lblUptime.Size = new System.Drawing.Size(0, 13);
+            this.lblUptime.TabIndex = 13;
+            // 
+            // lblCpuUtil
+            // 
+            this.lblCpuUtil.AutoSize = true;
+            this.lblCpuUtil.Location = new System.Drawing.Point(220, 118);
+            this.lblCpuUtil.Name = "lblCpuUtil";
+            this.lblCpuUtil.Size = new System.Drawing.Size(0, 13);
+            this.lblCpuUtil.TabIndex = 16;
+            // 
+            // label25
+            // 
+            this.label25.AutoSize = true;
+            this.label25.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label25.Location = new System.Drawing.Point(18, 254);
+            this.label25.Name = "label25";
+            this.label25.Size = new System.Drawing.Size(46, 13);
+            this.label25.TabIndex = 12;
+            this.label25.Text = "Uptime";
+            // 
+            // lblTotalOpsReceived
+            // 
+            this.lblTotalOpsReceived.AutoSize = true;
+            this.lblTotalOpsReceived.Location = new System.Drawing.Point(220, 234);
+            this.lblTotalOpsReceived.Name = "lblTotalOpsReceived";
+            this.lblTotalOpsReceived.Size = new System.Drawing.Size(0, 13);
+            this.lblTotalOpsReceived.TabIndex = 4;
+            // 
+            // lblAvgOpTime
+            // 
+            this.lblAvgOpTime.AutoSize = true;
+            this.lblAvgOpTime.Location = new System.Drawing.Point(220, 96);
+            this.lblAvgOpTime.Name = "lblAvgOpTime";
+            this.lblAvgOpTime.Size = new System.Drawing.Size(0, 13);
+            this.lblAvgOpTime.TabIndex = 15;
+            // 
+            // label14
+            // 
+            this.label14.AutoSize = true;
+            this.label14.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label14.Location = new System.Drawing.Point(18, 234);
+            this.label14.Name = "label14";
+            this.label14.Size = new System.Drawing.Size(159, 13);
+            this.label14.TabIndex = 14;
+            this.label14.Text = "Total Operations Received";
+            // 
+            // lblSiteQueueCount
+            // 
+            this.lblSiteQueueCount.AutoSize = true;
+            this.lblSiteQueueCount.Location = new System.Drawing.Point(220, 73);
+            this.lblSiteQueueCount.Name = "lblSiteQueueCount";
+            this.lblSiteQueueCount.Size = new System.Drawing.Size(0, 13);
+            this.lblSiteQueueCount.TabIndex = 14;
+            // 
+            // label15
+            // 
+            this.label15.AutoSize = true;
+            this.label15.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label15.Location = new System.Drawing.Point(18, 212);
+            this.label15.Name = "label15";
+            this.label15.Size = new System.Drawing.Size(164, 13);
+            this.label15.TabIndex = 13;
+            this.label15.Text = "Total Operations Processed";
+            // 
+            // lblClientQueueCount
+            // 
+            this.lblClientQueueCount.AutoSize = true;
+            this.lblClientQueueCount.Location = new System.Drawing.Point(220, 49);
+            this.lblClientQueueCount.Name = "lblClientQueueCount";
+            this.lblClientQueueCount.Size = new System.Drawing.Size(0, 13);
+            this.lblClientQueueCount.TabIndex = 13;
+            // 
+            // lblTotalOpsProcessed
+            // 
+            this.lblTotalOpsProcessed.AutoSize = true;
+            this.lblTotalOpsProcessed.Location = new System.Drawing.Point(220, 212);
+            this.lblTotalOpsProcessed.Name = "lblTotalOpsProcessed";
+            this.lblTotalOpsProcessed.Size = new System.Drawing.Size(0, 13);
+            this.lblTotalOpsProcessed.TabIndex = 3;
+            // 
+            // lblAdminQueueCount
+            // 
+            this.lblAdminQueueCount.AutoSize = true;
+            this.lblAdminQueueCount.Location = new System.Drawing.Point(220, 25);
+            this.lblAdminQueueCount.Name = "lblAdminQueueCount";
+            this.lblAdminQueueCount.Size = new System.Drawing.Size(0, 13);
+            this.lblAdminQueueCount.TabIndex = 12;
+            // 
+            // label16
+            // 
+            this.label16.AutoSize = true;
+            this.label16.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label16.Location = new System.Drawing.Point(18, 189);
+            this.label16.Name = "label16";
+            this.label16.Size = new System.Drawing.Size(110, 13);
+            this.label16.TabIndex = 12;
+            this.label16.Text = "Total Connections";
+            // 
+            // label17
+            // 
+            this.label17.AutoSize = true;
+            this.label17.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label17.Location = new System.Drawing.Point(18, 165);
+            this.label17.Name = "label17";
+            this.label17.Size = new System.Drawing.Size(117, 13);
+            this.label17.TabIndex = 11;
+            this.label17.Text = "Active Connections";
+            // 
+            // lblTotalConnections
+            // 
+            this.lblTotalConnections.AutoSize = true;
+            this.lblTotalConnections.Location = new System.Drawing.Point(220, 189);
+            this.lblTotalConnections.Name = "lblTotalConnections";
+            this.lblTotalConnections.Size = new System.Drawing.Size(0, 13);
+            this.lblTotalConnections.TabIndex = 2;
+            // 
+            // label18
+            // 
+            this.label18.AutoSize = true;
+            this.label18.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label18.Location = new System.Drawing.Point(18, 141);
+            this.label18.Name = "label18";
+            this.label18.Size = new System.Drawing.Size(126, 13);
+            this.label18.TabIndex = 10;
+            this.label18.Text = "Total Operation Time";
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label9.Location = new System.Drawing.Point(18, 118);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(92, 13);
+            this.label9.TabIndex = 9;
+            this.label9.Text = "CPU Utilization";
+            // 
+            // lblActiveConnections
+            // 
+            this.lblActiveConnections.AutoSize = true;
+            this.lblActiveConnections.Location = new System.Drawing.Point(220, 165);
+            this.lblActiveConnections.Name = "lblActiveConnections";
+            this.lblActiveConnections.Size = new System.Drawing.Size(0, 13);
+            this.lblActiveConnections.TabIndex = 1;
+            // 
+            // label10
+            // 
+            this.label10.AutoSize = true;
+            this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label10.Location = new System.Drawing.Point(18, 96);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(123, 13);
+            this.label10.TabIndex = 8;
+            this.label10.Text = "Avg. Operation Time";
+            // 
+            // label11
+            // 
+            this.label11.AutoSize = true;
+            this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label11.Location = new System.Drawing.Point(18, 73);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(166, 13);
+            this.label11.TabIndex = 7;
+            this.label11.Text = "Site Operation Queue Count";
+            // 
+            // lblTotalOpTime
+            // 
+            this.lblTotalOpTime.AutoSize = true;
+            this.lblTotalOpTime.Location = new System.Drawing.Point(220, 141);
+            this.lblTotalOpTime.Name = "lblTotalOpTime";
+            this.lblTotalOpTime.Size = new System.Drawing.Size(0, 13);
+            this.lblTotalOpTime.TabIndex = 0;
+            // 
+            // label12
+            // 
+            this.label12.AutoSize = true;
+            this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label12.Location = new System.Drawing.Point(18, 49);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(176, 13);
+            this.label12.TabIndex = 6;
+            this.label12.Text = "Client Operation Queue Count";
+            // 
+            // label13
+            // 
+            this.label13.AutoSize = true;
+            this.label13.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label13.Location = new System.Drawing.Point(18, 25);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(178, 13);
+            this.label13.TabIndex = 5;
+            this.label13.Text = "Admin Operation Queue Count";
+            // 
+            // ServerStatusMonitor
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(620, 333);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.statusStrip1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "ServerStatusMonitor";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Server Status";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ServerStatusMonitor_FormClosing);
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Timer pollTimer;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.ToolStripStatusLabel lblLastUpdated;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Label lblServerDisplayName;
+        private System.Windows.Forms.Label lblServerStatus;
+        private System.Windows.Forms.Label lblServerVersion;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.Label lblCpuUtil;
+        private System.Windows.Forms.Label lblTotalOpsReceived;
+        private System.Windows.Forms.Label lblAvgOpTime;
+        private System.Windows.Forms.Label label14;
+        private System.Windows.Forms.Label lblSiteQueueCount;
+        private System.Windows.Forms.Label label15;
+        private System.Windows.Forms.Label lblClientQueueCount;
+        private System.Windows.Forms.Label lblTotalOpsProcessed;
+        private System.Windows.Forms.Label lblAdminQueueCount;
+        private System.Windows.Forms.Label label16;
+        private System.Windows.Forms.Label label17;
+        private System.Windows.Forms.Label lblTotalConnections;
+        private System.Windows.Forms.Label label18;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.Label lblActiveConnections;
+        private System.Windows.Forms.Label label10;
+        private System.Windows.Forms.Label label11;
+        private System.Windows.Forms.Label lblTotalOpTime;
+        private System.Windows.Forms.Label label12;
+        private System.Windows.Forms.Label label13;
+        private System.Windows.Forms.Label lblUptime;
+        private System.Windows.Forms.Label label25;
+        private System.Windows.Forms.Label lblOsVersion;
+        private System.Windows.Forms.Label lblVirtMemTotal;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.Label lblVirtMemAvail;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.Label lblPhysMemTotal;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label lblAvailPhysMem;
+        private System.Windows.Forms.Label label4;
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.resx	                        (rev 0)
+++ sandbox/maestro-3.0/Maestro.Editors/Diagnostics/ServerStatusMonitor.resx	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,630 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="pollTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>120, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+        BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+        AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+        AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiHiIeIeIeHh4eHh4eHh4eHh4eHAAAACIiPiI+I+I+P
+        iPiIiIiIiIiIiIiHgAAACI/4//j/j4+I+I+P+P+Pj4+Pj4/4cAAACIj4+I+IiIiIiIiIiIiIiIiIeIiI
+        gAAACI+IiHh4iIh4h4eHiIiIiIiFGYj4cAAACI/3d3d3Z2d3Z3dneHiIiIh3l4j4cAAAB4+PiIiIiIiI
+        iIiIiIeIiIiHh4iIcAAACI/4+Pj/j4+IiIiIiIiIiIiIeIj4cAAACIj/////////////j4+Pj/////+I
+        gAAACIiIiIiIiIiIiIh4iIiIh4eHh4h3AAAAAAh4eHh4eHh4eHiHh4d4eHh4eHeAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAiIiIiIiIiIiIiIiIiIiIiIiIiAAAAAAIh4h4h4eHh4eHh4eHeHh3eHeHeH
+        AAAACHj4+I+Pj4+Pj4j4+Pj4j/j4+PiIgAAACI+I+PiI+Ij4iPiIiIiPiGeniIj3cAAAB4+IiIiIiIiI
+        iIiIiIiIiHd6iIj4gAAACI+IiIiIiIiIjoiIiIjoeH54iIj4cAAACIj4jGxsbGxsZcbGxsZcbHdGx4j4
+        cAAAB4+IZ3h4eHh4eHh4d4yHh8h3d4iIcAAACI+Px+d+d+jo6Ojo6OjnyOyMZ4j4cAAACIiPZ3fIyHd4
+        d4yIyHyH7IyIx4iIgAAAB4+IfIh4jofo5+jojofsh8jIZ4j4cAAACI+PZ3yOyMiMh4h+jIyIyM53x4j4
+        cAAACI+IfIjtjojo5+eMiOjIzoyHaIiIcAAACIj4doyOeMjIyH6I53fofIyMfIj4gAAAB4+Px4h3eI5+
+        jIjIeMjIyMjIZ/iIcAAACI+PbI53fIyMjo6OeOh+fnyOV4j4gAAACI+Pdod3jsjOfIeMjIyMjI54x4j4
+        cAAACI+IfIeMjIyMiHeI6H53yMjIZ4iIgAAAB4+PZ4eOfOfsjnfsjIyHjIyHx4j4cAAACI+Px37cjIx3
+        yHeIeHjIyOjIaIj4cAAACI+PfIjsfOx8iOfIyMjnjIyIx4iIgAAACI+PZ4yM58jI596I6OyMjnjIZ4j4
+        cAAACIj4fI7Ix8jIjIjIyNh4yMjox4j4cAAAB4/4dox8jIzoeOh4d+yOjIyMd4j4cAAACI+Px4yM7Gd3
+        eMjId4jIeIh4x4j4cAAACI+PfI7HyMh4eIiH6MiMjIyOd4j4gAAACI/4Z4yIh4yOjI6HiIeIjoh3x4+I
+        cAAACIj/fGjGxn5cd8fMfGxsfHxseIj4gAAAB4+Phnx3fHx3x2d3x3d2dnZ3yIj4cAAACI/4///4////
+        /4+Pj4iPj4j4+Pj4cAAACI+PiPj/j4+Ij4+Pj4+PiPiPiIj4cAAACI////+P//////j////4///4//+I
+        gAAACHiIiIiIiIiIiIiIiIiIiIiIiIiHgAAAAIiHiIiIeHh4eIh4eHh4h4eHh4eIAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD///////8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAADwAA+AAAAAAfAAD///////8AAPgA
+        AAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA
+        AAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA
+        AAAABwAA4AAAAAAHAADgAAAAAAcAAPAAAAAADwAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAiIiIiIiIiIiIiIiIAAAAiIiIiIiIiIiIiIiIiIgAAIj////4
+        +PiIiIiIiIiHAACPiIh4iIh4iIiIiIV/+AAAiPd3d3d3d3eIiIh3mIcAAI/4/4+IiIiIiIiIiIj4AACI
+        j4/4////j4j4/4+PhwAACIiHiHh4eIeIeHeHh4AAAAAAAAAAAAAAAAAAAAAAAAAIeIeIeIeHiHh4eHh4
+        cAAAiPj4+PiPj4j4+PiI+IgAAH+IiIiIiIiIiIiGeIj3AACPiIeHeH54d3d+d2eIiAAAf4jGzsfIx858
+        jHd8iPcAAIiH6IiIiOiIjofI53iIAACPiMjIzo6OjnfI7HyIiAAAf4jIjoh3eHjI7IyHePcAAI+Hfnd3
+        5+fojt53x+iIAACI98h3jIyIyMjIyOWIiAAAiIh4d+fI6I6H53yMiIgAAI+IyOfI7IyMjIyHdoiIAAB/
+        iGjIzIeIeOh3yOWIiAAAj4jIfIzsjIyMjoyMiIgAAIj36M7IyI6IeMjIhoiIAACPiMfIx4d4yMjofIyI
+        9wAAf4jIx+yOh4joyIh2iIgAAI+IaOd4d8jIyIyMjIj3AACI+MfHzHx3Z3x2dnaIiAAAj4//////+Pj4
+        +I+Ij/cAAIj/j4/4+P+P+P/4//iIAACIiIiIiIiIiIiIiIiIiAAAAAAAAAAAAAAAAAAAAAAA8AAAD8AA
+        AAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAf/////4AAAB8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
+        AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA///
+        //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AACIiIiIiIiIiIiIAACP
+        +Pj4iIiIiIiIAAj4iIiIiIiIiIeIgAj4h4d4d4iIiHePgAiP/4/4+IiI+Pj4gACIeIiIiIiIeHh4AAAA
+        AAAAAAAAAAAAAACIiIiIiIiIiIiIAAiPj4j4iIiIh2+IgAj4d3fId3d353eIgAiIyOiOjo53fIz4gAj/
+        aMjId4yMjIaIgAiIeH6Ojojozoz4gAj4yMh8jIyMjIeIgAj/aIfniOh+jIyPgAiId+yM53d8h+eIgAj/
+        yHx8h3eHyMeIgAiPaMjIeMjI6Iz4gAj4fIzneOiMjIb4gAj4eMjIjIeIeHz4gAj/xnZ8d8bGxnePgAiP
+        ////j////4+IgACI+I+PiPiI+Ij4AAAIiIiIiIiIiIiAAMAAAwDAAAMAgAABAIAAAQCAAAEAwAADAP//
+        /wDAAAMAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+        AQDAAAMA4AAHACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACIiIiIiI
+        iIAI+IiIiIiIgAiIiIiIiHiACIiIiIiIiIAAj4iIiIiIAAj4j4iIiIiACId8h+d8eIAIjI6Oh+jIgAiI
+        6HjIyGiACIyMjojIyIAIiHyMjI54gAiOyMiOfIiACIfOiMiIyIAIh3x3fHx4gAj///j///iAAIiIiIiI
+        iACAAQAAgAEAAIABAACAAQAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+        AADAAwAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAABycnIAdHNzAJdV
+        PgCZVj4AnFg/AOdgPgDoYT8AnVhAAKJbQQClYEYAq2JGAKdnTwCsZEgArGlPALBkRwCxZkkAsmtPAK1q
+        UACybFEAtnJXAL91XgCrdWEAr3hlALB5ZQC1fWkA6GZDAOhrRADpbEsA6XFHAOlzSgDqe00A6nNTAOt8
+        VADqdlgA63pcAMZ7YwDLfmQA635iAD2sRwBFq00AWqFaAFiuXQBknWEAXbZkALKCcQDqhFEA64xWAOuD
+        XADsjV4A7JRcAO2aXQDHgGYAyoFmAMqFaADKimwAypBvAMqUcQDsgWQA7YtiAOyEagDti2wA7ZNlAO2f
+        YADtkmwA7ptrAOKMdQDtjHMA4494AO6PeADuk3MA7pp0AOOQeQDuk3oA75x4APCbeQDuo2MA76lmAO6k
+        bgDvrGoA77NsAO+4bgDvo3QA76pxAO+heQDwqnUA8KZ5APCregDvtnAA8LN2APCzewDwuHoAIyKdABkZ
+        rgAjI6kAYV2VAEpKuwBuarIATk7FAHZ20QCBfcEAjoyMAJWIkwCflpMAn56dALSPggColo4At5GEALiR
+        hAC/mIoAoJeUAKmXkACgmJUAqpiRAKyakwCrmpQArJuUAKyclQCim5gAppuYAKOcmgCknZsApJ6cAK2e
+        mACloJ4Ar6CaALCgmgCwop0AsaSfALWmnwCelbYAqp2yAKaioQCvqaYArq6uALKloAC0pqIAsqOlALWo
+        ogC1qaUAuaulALqtqQC9sKsAvbGtALOzswC3srEAubSzAMGajADFnpAA75eAAO6ahADvnogA8JeAAPCa
+        hADwnokAxqCSAMihkgDMqJsA0KmZAO+giwDwpoAA8KyCAPChjADxtIQA8ryJAM2soADBsasAwLOtAMSy
+        rQDBtK4AxL+vAMK1sQDBt7QAx7W2AMO4swDHuLIAwri1AMS5tQDLu7UAxL68AMi+ugDMvroAyb+8ANO/
+        uADWv7gA8cGFAPLCiwDMwLsAysG9AMzCvgDOxL8A1cK6ANnEvQC+t9AAxr3LAMvDwADNw8AAzcXBAM/H
+        xADPyMQA0MbDANvHwADQyMUA28jAANzJwQDYysQA3crEAN7MxgDSy8gA1M3KANXPzADfzsgA1dPHANbQ
+        zQDf0MoA2dLOANvT0ADa1NEA3NXSAN3W1ADe2NYA39nYAODPyQDg0MoA4dLNAOLUzgDj1dAA5NbRAOXY
+        0wDm2dUA6NvXAOjc1wDo3dgA5+DdAOrg3ADs4t4A7ePgAOnm4wDt5eEA6ubkAO3n5ADs6OYA7enoAPDn
+        5ADw6eYA8eroAPLs6gDz7uwA9O7tAPTw7gD28vEA9/TyAPj08wD49vQA+fj2AP///wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIuLi4uLi4iIiIiAgIB9fXt7
+        e3t7e2p7am9qampqampqampqampqiwAAAAAAAAC8i7zd3d3d3d3d3d3b29vb29vb19fX19fX19fX19fX
+        19fX19fX19emaqcAAAAAAACLsP339/X19fPz7u7u6u7q6ufn6ufn5+fn6uXq5erl6uXq5erl6ur3gHEA
+        AAAAAACLw/zz7urq6ufl4+Pj08/Pz8/AwMDAwMDAwMDAwMDAwMDAg2TBz8D1p3EAAAAAAACLw/3zs4SE
+        fHx8eXl5eXl2dmd2dmdnZ3m3hZGSz8DAwMCIXF1ewsn1p3EAAAAAAACLw/31ZQEBAQEBAQEBAQEBAQEB
+        AQEBAQGneZGGtMDAwMBmYGJigsn1p3EAAAAAAACLw/316dXV0tLS0NDIyLzAvLyysrKwsrLAiH2IwMDA
+        wMmnX2NhrMn1p3EAAAAAAACLvP339fX38/Pz8+7u6u7l5eXl4+Pf39PPz8/PwM/Jz8nJsoi0zNP1p2oA
+        AAAAAACNjfb9/f39/f39/P39/fz8/Pr6+vf69/f39/f39/f39/f39/f39/fze3sAAAAAAADbi42zsLOw
+        s7Oss6yws6ywsLCwrKynrKenpqaNjY2NjY2NjIyMjIF7agAAAAAAAAAAAKaLi4uLi42IjYuNiIuLi4uI
+        gIiAgIB9fX17e3t7cXFqb29qamp1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAANCwsLCwsLCwsLCwsLCwrKysrKynrKynrKesp6ynp6ynp6enp6fIAAAA
+        AAAAAAAAiICAgICAdYB1gHt1dXV1dXV1e3t7cXt7antqe2p7am9vb29qampqewAAAAAAAACNgNDz8/Pz
+        9vPz8/P28/bz8/Pz8/Pz8/Pz8/Pz8+3z7fPz8/Pz8/PQaoAAAAAAAACAsPrl5eXk5OXl5eTk5OPk49fj
+        49fj1+PX49fj1tfWKScnJ9XX4+P1jXEAAAAAAACAsvfjz9bWz8/Pz8/PwM/Az8DAy8DAwMDAwMDAwMDA
+        KywsKqrAwMD1p2oAAAAAAACAs/fj1s+dm5uUlJOTk5OTk5STk5OTk5OTbZNtk21ta2lpa5u3wMn1p28A
+        AAAAAACAtPff3xkJCQkJCQkJCQkJCQkJCQkJCQQEBAQEBAQEBAMDAwMtwMn1p28AAAAAAACAtPfj4w4K
+        JSUlNjY2ODY5ODk5OTk5OTY4NjY2JTQkJCQkFQQWwMn1p3sAAAAAAACAtPfj4w4KmJhLS6CgoaOkpLq6
+        ubm5ubmjV1ZHR0A9Ojo6QgQWwMn1p2oAAAAAAACItPfj4w4KSz09QEBLTqBVWltRUVFbWVNOQTIxMCEe
+        HBwgQgQWwMn1p3sAAAAAAACAtPfk4w4PmUM9QEFLTlVXWlBRUVFbWVVOQTI7MCEhHBwgQgMWwMn1p28A
+        AAAAAACIvPfk4xALlkZGRkZLTldXVU1NT1laWVVOTjI7MSEgHhwiQgQWwMn1rHEAAAAAAACIvPrk5BIL
+        lkZDRktLTqBVP0xMTVpaVVNOQUA7MCEhIBwiQgQWwMn1p3sAAAAAAACIvPfn5BELmZhGRktLoE4yMzNM
+        T1paVVVBQTI7OiEgIBwhRAQWwM/1p28AAAAAAACIvPzl5xILmUlGRkZLRzsvMjIzVVdXVUdHQT07OjAh
+        ICAmRAQWwMv1rHsAAAAAAACIvPrl5RELl5WYRphHOzAuLy8yV6BOoEFBQDs7MCEiIiAmQgQWz8v1p3sA
+        AAAAAACIvPrq5RELmklJmEZDHx8uLjBBVUqgR0dGQD06OiYiIiImQgQWyc/1p3EAAAAAAACIvPrq5xEO
+        mZlJSUYeHR0fHx9HS0dHR0ZAPT06OiEmIiI6RAQWz8v1sHsAAAAAAACIvPrq6hELmppJSSAaHR0dHTBL
+        SkpHRkZAPT06OiYmIyM6RAQWz8/1p3sAAAAAAACLvPrq6hEQl5qZJgYHBx0aHUBLS0lGRkZDPTw6OiYm
+        JiM8RAQXz8/1p3sAAAAAAACLvPrq6hEOmqI8GgYHBwcdHUlJSUpJRkM9PT08PDwmOjo8SAQXz8/1sHsA
+        AAAAAACLvPzu6hEPl5oaBgYHBwcGIZVJSUlGRUNDQzw8PDw8OjpDRAQXz8/3p3sAAAAAAACLvPzu6hEQ
+        lyIaBgYaBwcaRZWVSUlJRUNDQ0NDPEM8PDxDRAQX38/3rHsAAAAAAACLvPzu6hEQSRoGBgYGBgYgmZWY
+        lZVJSUlFQ0NDQzw8PDxFRAkX1t/3p3sAAAAAAACLvPzu8xEQRRwGBgYGBwdDmZqYlZWVSUlJSUVDQ0VD
+        QzyYRAQY39/3rHsAAAAAAACLvPzz7hEQQxwaGhoaGhyimqKampqampiZlZWVSUlFRUWVRAkY39/3rHsA
+        AAAAAACLvPzz8xEQSUVFRUVFRZWioqKioqKamqKil5eXl5eXl5eWRAkY49/3rHsAAAAAAACLw/zz8xQL
+        ERAQEBAQEBAQEBAQEBAOEA4OCw4OCg4LDgoOCQkY49/3rHUAAAAAAACLw/zz850RDxAQEBAQEA4QDg4O
+        DgoPCwoKCgoKCgoKCQoJCgyl4+P3rHUAAAAAAACLw/zz8/Pz8/Pz7u7u7urq6urq6urm6urn5ubm5uTk
+        5OTk5OTj3+P3snsAAAAAAACLw/zz8/Pz8/Pz7vPu7u7u6urr6urq6urq5uvm5ubn5+Tk5OTk5OT3rHUA
+        AAAAAACLpvz8/Pz8/Pz8+vf99/35/fr6+vr4+Pj4+Pj4+Pj4+Pj49/f39ff3iH4AAAAAAADSi5LD0MfH
+        x8PHyMjIyMPIyMjIyMTIyMjIyMDIwMjAw8DDtLy0w7SMe8gAAAAAAAAAx42NhYuLi4uLi4uLiIuIiIiI
+        iIiIiICIgICAfYB9fX19gIB+fn57wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD///////8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAADwAA+AAAAAAfAAD///////8AAPgA
+        AAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA
+        AAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
+        AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA
+        AAAABwAA4AAAAAAHAADgAAAAAAcAAPAAAAAADwAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAOhhPwCfW0QApF5EAKZgRQCsY0YApGFIAK5lSgCtZk4AsGdKAK9o
+        UACwaFAAtm5XAL9wVAC3cFgAuHJZALh1WwC+dVoAuXldAL15XQC6fl8AvXxeAKt8awC9fmAAwHNZAMF0
+        WgDEdVoA6GVCAOlsRQDpakkA6W1NAOpySADqdE8A6nlMAOpxUgDqdVIA6nNUAOp1VQDrflAA639VAOt2
+        WADreFoA639aAOt5XQDse18A635eAOx+XADsfmEASbFSALuAYAC8gGAAsoJwALSDcgC1hHIAs4R1ALeG
+        dAC4h3UAuoh2AL6NegDrhFIA641WAOyAWADsgV4A7IteAOyTWgDtnl8A3INqAMCOewDBj3wA24x1ANyP
+        eADDkX4A3ZB5AOyFYwDsgWYA7IRlAOyJYQDsj2EA7YtlAOyEagDtiWkA7Y1oAO2IbgDtjW0A7ZdmAO2Z
+        YQDunGQA7pFoAO2UaQDukG4A7pVuAO6abgDunW4A7YxzAO6QcQDvlnIA7pJ2AO6VdQDvm3MA7p5yAO+a
+        dgDvnXYA7pF5AO+VeQDvk3wA75V9AO+beADwmXoA7qNiAO6nZQDvrGcA76JtAO+0awDvtm4A7qFyAO+h
+        dwDvp3YA76h0AO+jeADvpHoA8K5zAPCsdQDwp3gA8Kp5APCueQDwrX8A8LNzAPCzdQDxsHkA8LR6APG1
+        fwDwuHkA8b59ACMjqwBhX7wAcW69AGNj0wCBd5sAh4OCAIeEggCIhIMAiYaFAIqIhwCKiIgAjYuKALqP
+        gACpl48AvJKCAKmXkACqmJEAq5qUAKyblACtnJYArp6YAJy4kACvoJoAsaGZALGinACypJ8As7CeAJeN
+        pACdj6cAp6SjAK6opgCypaAAtKaiALSoowC1qaUAtquoALetqgC5raoAuK+sALqxrgC8sq4AuquxALuz
+        sAC9tLEAvbe0AMWUggDBl4gA75aAAO+ZgQDwl4EA8JmDAPCdiADxoY0A8bWDAPG+gQDyvYYAz6+kAMG1
+        rwDVsqQA0basAMK2sgDDuLMAwri1AMa6tgDHvLYAzbu1AMa8uQDJvrkA1761ALfStAC51LYAysC7AMrA
+        vQDMwr4A2sW+AMzDwADOxcEAzsbEANvHwADQycYA28jAANzJwgDdy8QA3szFANLLyADUzMkA387IANrf
+        1ADgz8kA4dDLAOLSzADj1M8A49XQAOTV0ADi19UA5djTAObZ1QDg3tcA6NzXAOHa2ADk3doA5t7cAOnd
+        2QDm4N4A6eHeAOzi3gDp4uAA7ePgAOrk4QDt5eIA6ubkAO3m5ADt6OYA7uroAPDp5gDx6ugA8ezqAPDt
+        7AD07u0A9fDuAAAAAAAAAAAA////AAAAAADS0tLS0tDS0NDIyMjIyMXFxcXFxcXFxcUAAAAAAADQsNnZ
+        2dnR0dLQ0NDQ0MjQyMjIyMjIyMjIyJ2+AAAAAKf1+PXw8PDw5+fk5OTf39/k3+Tf5N/k5Off6pIAAAAA
+        p/rwxbCwrKyrqKinpaWlpcbFyM/Pz6GFh9bwkgAAAACn+uiQkI+Ojo6OjoqOio6OpaKjz8/PiYiG1u+S
+        AAAAAKf69vX49fDw8Ofn5N/f1tbWz8/Wz9bGoK7W8JIAAAAArNn19fX19fD18PPw8/Dw8+/v6urq6urq
+        6urFmwAAAAAArKenp6enqKeop6elpJubm5mZmJiYkpKSkp0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAKWbm5mbmZmYmJiYmJiYmJiYlJiSmJKUlJKYAAAAAACl2fD18PD18PDw8PDw8PDz
+        8PDw8ObKyubw8NKYAAAAAJ3w5Nvf29vW29bW1tbW2c/Pz8/PnzAwms/P8JIAAAAAnfXfyTo6OTo5ODk4
+        NjY1NjU2MzMzFhY2wM/vkgAAAACl8OQ6BxgYGBISMjIyMjISEhIQEAwMDAKRz++SAAAAAJ313zoYZ2Fq
+        d326vLuEvIN7clhOPilKB5HR8JIAAAAApfXkOhhnU1hlcoF/cHGDeG9UPycgHS8IkdPwmAAAAACl9ec6
+        GGdhYWV7e21tf4F4b1Q/PiAdSgiR0++SAAAAAKX150MYtF5hZXdUQW2Be3VvWE4nJSUvCJHT8JgAAAAA
+        pfXnQxi3YWFqVDxAVHt7cltUSj4lJUoIkdbvkgAAAACl9udHGLdnZ1MhJjtvd3JlWFM+PiUlSgqR1u+Y
+        AAAAAKX260cYuGheHB8hJmVqamFYU0opKSleCJHW8JgAAAAApfbrshi5aB0bHBw+a2phYVNKSkovL1IM
+        kdbwlQAAAACn9vBHGLkoAQEBAWFnZ2FeXkpTSkovXgiz1vCYAAAAAKf28EcaYAEBAQEdZ7RnZl5SZlJK
+        UkpmC5Hf85gAAAAAp/rwsholAQEBAUq3trRmaGZdXV5SUmYLs9vwmAAAAACn+vCyGiUbGxscuLi4uLa2
+        tGhoZmZdtAuz3/OYAAAAAKf6+LINQkJCQkJISEhGRkZGRUVFRUVFB7Pf8JgAAAAAp/rwvwkJCQUHBwcH
+        BQcEBQQEBAQDAwIEvd/zmAAAAACn+vj48PDw8PDw8PDr6+vr6+vl5eXk5OTk5PCZAAAAAKfw/Pz8/Pz8
+        +vr6+vr6+vr39/f39/X09PDw6pkAAAAA2ajHx9DFx8fIyMbFxsXFwsTExMTCwsLCwsKb0gAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAPwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAD4AAAB///
+        ///gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
+        AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAD/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+        AAAAAAAAAAEAAAABAAAAAAAA52A+AOhhPwCmYEYAqmJIAKxjSACqZEoArWVKALFmSgCxaEwAoWVQAKRn
+        UQCmaFIAqGpTAKdzYQCsd2UArnhlALB6ZgC6emEAsnxoALV+aQDoYkAA6GZBAOlsRgDpbEoA6W9NAOlw
+        RwDqd0oA6nFRAOp1VQDqeVIA63pVAOt6WQDreV0A63xfANV/ZwDZfmQA635iAOx9YQDsf2QATq9VAFao
+        WQC5jn8A64BTAOuFUgDsiFsA7IleAOyTWgDskF0A7ZteANqGaADbjm0A3YpxAN2OcQDdlXQA3JhzAN6d
+        eADmgGYA7IVhAOyBZQDtj2cA54NqAOeGbADthWoA7IdtAOeIbwDti2oA7o9pAO2IbADuj2wA7ZlmAO6U
+        aQDtmGgA6IpyAO2KcQDujXIA6I11AO6NdQDukXAA7pF1AO+VdgDumXAA7pxyAO+ZdQDpkHgA75J6AO6V
+        eQDplH4A7pV9AO+ceQDdoXgA36V8AN6sewDeqn0A7qhlAO+2bgDvoXEA76dxAO+hdgDvpXUA76hwAO+l
+        eADwrHYA8KV6APCqeADvsXEA77RwAPCxeQDwtngAX1y6AGBfwwCBeKQAnJWSAJ2XlACemJYAn5qYAKGb
+        mgCinZsAo5+dAKOgngCxoJkAsqKcALOknQC0pZ8AlomtAKShoACtpqQAtaegALappAC4q6YAua2pALyu
+        qAC+sasAu7CsAL2xrQDBk4IA75aAAO+YgQDvm4UA75yHAPCYgwDwnIcA8J6KAPChjQDAs60AwbSvAMG2
+        sQDEuLIAw7m1AMW5tQDLubMAx7a7AMa7uADGvbkAx7+8AMm/ugDIv7wAy8C7AMrAvADMwb0A0cK9ANnF
+        vgDNw8AAzcTBAM/HxADPyMUA0MbCANbFxADbx8AA0sjDANXKwADQyMYA3MnCAN3KxADezMUA0srIANPM
+        yQDYzsoA387IANnOzADW0M4A2tHNANzT0ADb1dMA3NTSAN7W1ADf2NUA4M/IAODQygDh0swA49TOAOHX
+        0wDk1dAA4dfUAOXY0wDg2NUA5trVAOjb1wDo3NcA4drYAOTb2ADi3NoA5NzZAOPe3ADm39wA6N3ZAOfg
+        3gDq4NwA7OLeAOji4ADt4+AA7uXiAO/n5ADv6OUA8OnmAPLs6gD07uwA9fDuAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD///8AAAC0nJyampiYmJKSkZGEhISEhISEpgAAAACk0dHOzMzHx8fHv7+/v7+/
+        v7+/mAAAALDMx5+ampKSkYODg5aYoKGhfG2msZ8AALDMsH13d3dzc3JxcYB+kaGhb26XsZ8AALS32dnZ
+        19fW1tHRz83Gx8bGv7HNpqYAAACShoaGhIaEhISFhYN/f3t7e3h4fwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAACFpKSkpKSfpJ+fn5+fn5+cnJycewAAAKu3v729vL28rrG7rq6urq4pKKq7rp8AAKu3vYcU
+        FBMTExMTEBAQEBAODiqhsZ8AAKu/vQc0NDY4W11dXVo3MzIkJAqhsZ8AAKu/vwdWRVFja2pqbGRGLR4X
+        OQqhsZ8AAKvHvwdWT1FlZF5pa2NGLR8XPQqhsZ8AAKvHxgeJT1lRLzFmZmNHOiAdPQqotZ8AAKvHxgiM
+        Vk8rKy9nUVFDOiAdPQqusZ8AAKvHzQmMVh8aHjxZUU9DOiIhQQuusaQAAKvHzwmPOhUVF09ZT05AQCIi
+        TgqusaQAALDMzwlWFQIVHVZWVk5KQEA7TAq8saQAALDH0QkiFQIVToyIVlVVSkpKVQq8t58AALDM0QlK
+        ICIij4+Pj4yMiIiIVgu8t6AAALDM0RIICAgICAcHBQUHBwQEBBS9taQAALDM1dXV1dHR0c/Nzc3NyL+/
+        v7+9t6YAAACazMzMzMzMzMzMzMjIyMi/v7+/kgAAAAAAq6ukpKampKSkpKSkoqSkpKSkAAAAwAADAMAA
+        AwCAAAEAgAABAIAAAQDAAAMA////AMAAAwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+        AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwDgAAcAKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+        AAAAAQAAAAEAAAAAAADoYT8AtGtTAK1yXwC/cFQAsndjALV7ZgC2fmcAuXxmALx/aQDFdFgAwXZdAMxz
+        WgDNdlwAw3hfAMR5XwDXdVgA6GNBAOhmRQDpbEUA6nJQAOp1VQDqelAA63peAMV6YADOeWEA0H5mAOx9
+        YAC5gmkA64pVAOyFXQDXhGkA2IVrANmHbgDainIA7IFhAOyCZwDsimEA7YxkAO2FawDtiG0A7YxsAO6T
+        awDum2sA7YpxAO6OdgDulHIA7pB2AO+WdADvknsA75R5AO+WfwDvm3kA7qJnAO6hbwDvrW0A76JyAO+h
+        dgDvpXkA8K53APC6dgDxtnsA8bV+AJKIsgChl74AtKmlALWsqAC3r6wAtae8ALqzsAC8trQAvbm3APCZ
+        gwDKqp8AyqugAMutoQDNrqMAzrCmANGxpQDQs6gA0bSpANW2qgDXuK0A2LuvAMO2sADEt7IAxbmzAMW5
+        tADIu7YAyby3AMe9uQDJvbkAzb65ANW7sgDWvLMA2ryxAJ7ImwClxJ8Ay8C7AMrAvADMwr0A3sW7ANrG
+        vwDFuckAzMPAAM3FwgDOx8QA0MXCANXHwgDQx8QA0cnGANvLxgDezMYA08vIANXNygDUz8wA19DOAOLV
+        0ADk19IA5djTAOXZ1QDj29kA59zYAOne2QDr4NwA7OLeAO3j4ADt5eIA7+fkAPDp5gDx6+gA8uzpAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///wAAdGlpaGhbWlhYWFhYWGkAAHF5cnFoaFxbbGxsQGdYAAByckdGRUNCQlRcZT9E
+        XAAAaW5xcWlxaWhbaFtcWFQAAABpaWlpaWhoaGhbaFsAAABbeXp4eHZ1dXV1YWB2VAAAbF4ICQkJCRwI
+        BgUDUFwAAGlOHy46Pjw8OCUVDElYAABsUCAuODU3OyseFQxJWwAAblAhMiUdODgqIxUMS1sAAHFSIigT
+        FjQuKCMbGUtbAABxUiESEhsyMiwnIxlQWwAAcV8QEgEzSDIyLSwaUFsAAHFlBAoKGBgYDg4LAl5pAABx
+        goKBgYCAgH19fHx5WwAAAGlpaWlpaWloaFtoWwAAgAEAAIABAACAAQAAgAEAAMADAACAAQAAgAEAAIAB
+        AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAwAMAACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtqqmCLaqplC1qaV3tamlebWppXm0qKR5tKejebOn
+        onmzpqF5sqWgebKkn3mxo555sKKdebChm3mvoJp5rp+Zea2emHmtnZd5rJyVeayblHmrmpN5qpmSeaqY
+        kXmpmJF5qZeQeamXj3mpl495qZePeamXj3mpl495qZePeamXj3mpl495qZePeamXj3mpl495qZePeamX
+        j3epl49PqZePCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqYgtaml1LWppf62qqb/taml/rWp
+        pf61qaT/tKik/rSno/+zpqL+s6ah/rKloP6xpJ//saOd/rCinP6voZv/r6Ca/q6fmf6tnpf/rZyW/qyc
+        lf6rm5T/q5qT/qqZkv6qmJH/qZeQ/qmXkP6pl4//qJaP/qmXj/+olo7+qJaO/qmXj/+olo7+qJaO/qmX
+        j/+olo7+qJaO/qmXj/+olo7+qJaO0qmXjx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqa8taml/snB
+        vv7f2dj/39rY/t/a2P7f2tj/39nX/t/Z1//e2db+3tjW/t3Y1v7d19X/3dfV/t3W1P7d1tP/3NXT/tzV
+        0v7c1dL/29TR/tvU0f7b09D/29PQ/trTz/7a0s//2tLP/trSzv7Z0s7/2dLO/tnSzv/Z0s7+2dLO/tnS
+        zv/Z0s7+2dLO/tnSzv/Z0s7+2dLO/tnRzf+/sqz+qJaO/qmXj7oAAAAAAAAAAAAAAAAAAAAAAAAAALaq
+        phe2qqb/wri0//j29f/z7ev/8uzq//Hr6P/x6uf/8Ojm/+/n5P/u5uP/7eXi/+3j4P/s4t//6+He/+vg
+        3f/q39v/6d7a/+nd2f/o3dj/6NzY/+jc2P/o3Nj/6NzY/+jc2P/o3Nj/6NzY/+jc2P/o3Nj/6NzY/+jc
+        2P/o3Nj/6NzY/+jc2P/o3Nj/6NzY/+jd2f/o3Nj/6NzY/+nd2f/08O7/taaf/6mXj/6pl48VAAAAAAAA
+        AAAAAAAAAAAAALWppS+2qqb/y8PA/vf08/7u5eL/7ePf/uvh3f7q39v/6d3Z/ujb1//m2dT+5dfS/uTV
+        0P7i087/4dHL/uDPyf7fzcf/3cvE/tzKwv7byMD/28e//trFvv7axb7/2cS9/tnEvf7axb7/2sa//trG
+        v/7axr//2sW+/trFvv/ZxL3+2cS9/trFvv/ZxL3+qp2y/oF9wf++t9D+3crE/tvHwP/w6ef+wbSu/qmX
+        j/+olo4sAAAAAAAAAAAAAAAAAAAAALWppS+2qqb/y8PA/vj19P7w5+T/xL68/qejov6no6H/pqKg/qah
+        n/+loJ7+pZ+d/qSenP6knZv/o5ya/qKbmf6im5j/oZqX/qGZlv6gmJX/oJiU/qCXlP6flpP/n5aT/qab
+        mP7Tv7j/r6mm/reysf65tLP/2MrE/trFvv/ZxL3+2cS9/trFvv+zo6f+IyKd/hkZrv8jI6n+xr3L/tvH
+        wP/w6ef+wbSu/qmXj/+olo4tAAAAAAAAAAAAAAAAAAAAALaqpi+2qqb/y8PA//j29f/x6eb/joyM/3Jy
+        cv9ycnL/cnJy/3Jycv9ycnL/cnJy/3Jycv9ycnL/cnJy/3Jycv9ycnL/cnJy/3Jycv9ycnL/cnJy/3Jy
+        cv9ycnL/cnJy/3Rzc//Bsav/n56d/7Ozs/+urq7/zL66/9rFvv/axb7/2sW+/9rFvv+ViJP/Skq7/09P
+        xv9OTsT/npW2/9vHwP/w6ef/wbSv/6mXj/+pl48tAAAAAAAAAAAAAAAAAAAAALWppS+2qqb/y8PA/vj2
+        9f7x6uf/5+Dd/tfRzv7W0M3/1c/M/tXOy//UzMn+08vI/tLJxv7RyMT/0MbD/s/Fwf7Ow7//zcG9/szA
+        u/7Lvrn/yry4/sm7tv7IubT/x7iy/s28tv7XxLz/taah/rCinf6zpaD/1MG6/trFvv/ZxL3+2cS9/trF
+        vv/Esq3+YV2V/nZ20f9uarL+x7W2/tvHwP/w6ef+wbSu/qmXj/+olo4tAAAAAAAAAAAAAAAAAAAAALWp
+        pSy2qqb/ysK//vj29f7y6+n/8evo/vHr6P7x6uj/8enm/vDo5f/v5+T+7uXi/u3k4P7s4t//6+Dd/urf
+        2/7p3dj/59vW/ubZ1P7l19L/5NXQ/uLTzv7h0cz/4NDJ/t/Ox/7ezcb/3cvE/t3Kw/7cycL/3MjC/tzI
+        wv/cyML+3MjC/tzIwv/cyML+zbu1/rKjpP/OvLf+28jC/t3LxP/x6+j+wLOt/qmXj/+olo4pAAAAAAAA
+        AAAAAAAAAAAAALaqpge2qqb0uq6r/+/t7P/5+Pb/+ff2//n39v/59/b/+ff2//n39v/59vb/+Pb1//j2
+        9f/49vT/+PX0//f08//39PP/9/Py//bz8f/28vH/9vHw//Xx7//18O//9O/u//Tv7f/07+3/8+7s//Pu
+        7P/z7ev/8+3r//Pt6//z7ev/8+3r//Pt6//z7ev/8+3r//Pt6//z7ev/8+3r//Pt6//q5eP/rZyU/6mX
+        j/Opl48GAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqaAtaml/risqf7Durb/xLq3/sS6t/7Eurf/xLq3/sS6
+        t//Eurf+xLq3/sS6t/7Eurf/xLq3/sS6t/7Dubb/w7m1/sK4tf7CuLT/wbez/sG2sv7AtbH/wLSw/r+z
+        r/6/sq7/vrKt/r6xrP69sKv/vK+q/ryuqf+7rqj+u62n/rusp/+6rKb+uqul/rmrpf+5qqT+uaqk/rmq
+        o/+rmpL+qJaO/qmXj3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqYDtamld7aqpum2qqb/tqqm/raq
+        pv62qqb/tqqm/raqpv+2qqb+tqqm/raqpv62qqb/tqqm/raqpv61qqX/taml/rWopP60p6P/s6ei/rOm
+        of6ypaD/sqSf/rGjnv6wop3/sKGb/q+gmv6un5n/rZ6Y/q2dl/+snJX+rJuU/quak/+qmZL+qpiR/qqY
+        kf+pl5D+qZeP/qmXj/+pl4/oqZePdqmXjwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOm
+        ogGzpqISs6ahE7OmoROzpqETs6ahE7KloROypaATsqWgE7KloBOypaATsqWgE7KloBOypKATsqSfE7Gj
+        nxOxo54TsKKdE7CinBOwoZwTr6CbE66fmhOun5kTrZ6YE62dlxOsnJYTrJyVE6ublBOrmpQTq5mTE6qZ
+        khOqmJETqZiRE6mXkBOpl5ATqJaPE6mXjxGolo4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAsKGcKLChnI+woZu3r6CbuK+gmrivoJq4r5+auK6fmbiun5m4rp6YuK6emLiunpi4rZ2XuK2d
+        l7itnZa4rZyWuKyclrisnJW4rJuVuKyblLism5S4q5qUuKuak7irmpO4q5mTuKuZkriqmZK4qpmSuKqY
+        kbiqmJG4qZiRuKqYkbipl5C4qZeQuKmXkLiolo+4qJaPuKmXj7aolo6PqJaOJwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAACwoZxCsKGc9K+hm/6woZv/r6Cb/q+gmv6voJr/rp+Z/q+fmf+unpj+rZ6Y/q2e
+        mP6unpj/rZ2X/q2clv6tnZb/rJyW/qyblf6snJX/q5uU/qualP6sm5T/q5qT/quak/6rmpP/qpmS/qqZ
+        kv6qmZL/qpiR/qqYkf+pmJH+qZeQ/qqYkf+pl5D+qZeQ/qmXkP+olo/+qJaP/qmXj/+olo/+qJaO86mX
+        j0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwop3bsaKd/9bPzP/t6ej/7eno/+3p6P/t6ej/7enn/+3p
+        5//t6ef/7enn/+3o5//t6Of/7ejn/+3o5//t6Of/7ejm/+3o5v/t6Ob/7Ojm/+zo5v/t6Ob/7Ojl/+zo
+        5f/s5+X/7Ofl/+zn5f/s5+X/7Ofl/+zn5f/s5+X/6ebj/+nn4//p5+P/6ufk/+zo5f/s5+X/7Ofl/+vm
+        5P/SycX/qZeP/6mXj9gAAAAAAAAAAAAAAAAAAAAAAAAAALCinSKxo53/wrez/vXw7/7n29f/5tnV/ubZ
+        1P7m2NT/5djT/uXY0//l19L+5dfR/uTW0f7k1tH/5NXQ/uTV0P7j1c//49XP/uPUz/7j1M7/4tTO/uLT
+        zv7i083/4tPN/uLSzf7i0s3/4tLN/uLSzf7i0s3/4tLN/uLSzf/f0Mr+WqFa/j2sR/89rEf+RatN/tXT
+        x//i0s3+4tLN/uPUzv/z7uz+u62n/qmXj/+olo4fAAAAAAAAAAAAAAAAAAAAALGjnS+xo57/yL66/vLt
+        6/7h0cz/4M/J/uDPyf7fzsj/387H/t/Nx//ezMb+3szF/t3LxP7dy8T/3crD/tzKwv7cycL/3MnB/tvI
+        wf7cyMD/28jA/tvHv/7bx7//2sa//trGvv7axb7/2cS9/tnEvf7axb7/2cS9/trFvv/Wwbr+ZJ1h/l22
+        ZP9dtmT+WK5d/sS/r//ZxL3+2cS9/tvHwP/w6ef+wbSv/qmXj/+olo8tAAAAAAAAAAAAAAAAAAAAALGj
+        ni+xo57/yL66//Pt6//i0s3/4dDL/93Jwv/MqJv/yKGS/8egkv/HoJH/xp+R/8afkP/FnpD/xZ6P/8Sd
+        j//EnY7/xJ2O/8Ocjv/DnI3/wpyN/8Kbjf/Bm4z/wZqM/8GajP/Bmov/wJmL/8CZi//AmYv/wJiL/8CY
+        i/+/mIr/uJGE/7SPgv+0j4L/t5GE/8Shlf/Wv7j/2sW+/9vHwP/w6ef/wbSv/6mXkP+pl48tAAAAAAAA
+        AAAAAAAAAAAAALGjni+ypJ//yL+7/vPu7P7i087/4dHM/rd+af6lXUL/pFxB/qNcQv+jW0H+oltB/qJb
+        QP6hW0H/oFpA/qBaQP6fWkD/n1lA/p5ZP/6eWUD/nVg//p1YP/6cWED/m1c//ptXP/6bVz//mlc+/ppW
+        Pv6aVz//mVY+/plWP/+YVT7+mFU+/phWP/+XVT7+l1U+/phWP/+ygnH+2cS9/tvHwP/w6ef+wbSv/qmX
+        kP+olo8tAAAAAAAAAAAAAAAAAAAAALGkny+ypJ//yL+7/vPu7P7j1M//4tLN/qxpT/6nX0P/y35k/syA
+        Zv/MgWf+zIRo/syGaf7LiGv/y4ts/syNbf7LkG//y5Jw/suUcf7LlXL/y5Zy/sqWcv7KlHH/ypJw/sqQ
+        b/7Jjm7/yYts/siIav7IhWn/yIJn/seAZv/HfWX+x3xk/sZ6Y//GemP+v3Ve/phWP/+pdGH+2cS9/tvH
+        wP/w6ef+wrWv/qmXkP+olo8tAAAAAAAAAAAAAAAAAAAAALKkny+ypJ//yb+7//Tu7P/k1dD/49PO/6xp
+        T/+qYUX/7piA/++UeP/vl3n/75x7/++hff/wpoD/8KyC//Gxhf/yt4f/8ryK//LBjP/yw4r/8cKF//HB
+        hf/xwIf/8r2I//G3hP/xsYH/8Kp8/++jef/unHT/7pZw/+6PbP/tiWn/7YRm/+yAY//sgGX/4ox0/5hW
+        P/+qdGH/2sW+/9vHwP/w6ef/wrWw/6mXkP+pl5AtAAAAAAAAAAAAAAAAAAAAALKkny+ypaD/yb+8/vTv
+        7f7k1tH/49TP/qxpUP6qYUX/7pqD/u6NcP/ti2r+7pBs/u6Vbv7unHD/76Jz/vCodv7wrnj/8LR6/vC4
+        e/7vtW7/77hu/u+3bf7wuXj/8LR2/vCtcf7upW3/7Z1o/u2VYv7sjF3/64RY/ut8U//qdU/+6W5L/ulp
+        R//qc1T+4ox0/phWP/+pdGH+2cS9/tvHwP/w6ef+wrWw/qqYkP+pl5AtAAAAAAAAAAAAAAAAAAAAALKl
+        oC+zpaD/yb+8/vTv7f7l19L/5NXQ/q1qUP6rYUb/7puE/u6Pc//tjWz+7pJu/u6XcP7vnXP/76N1/vCp
+        d/7xrnr/8bR7/u+wbv7vsmr/77Vs/u+2cP7xuXv/8LN3/vCtc/7vpW7/7p1p/u2VZP7sjV//7IVa/ut9
+        Vf/qdlD+6W9M/ulqSf/qdFb+4ox1/phWP/+pdGH+2cS9/tvHwP/w6ef+wrWw/qqYkf+pl5AtAAAAAAAA
+        AAAAAAAAAAAAALKloC+zpaH/ycC8//Tv7v/m2NP/5dbR/65qUP+rYkb/7puE/+6Rdf/uj2//7pNx/++Y
+        cv/vnXT/76N2//Coef/wrnv/76tw/++pZv/vrWj/769p//C2dv/xtnv/8LF3//Crc//vpW//7p1q/+2V
+        Zf/tjWD/7IVb/+x+V//qd1L/6nFO/+lsSv/qdlj/4ox1/5lWP/+qdGH/2sW+/9vHwP/w6ef/wrWw/6qY
+        kf+qmJEtAAAAAAAAAAAAAAAAAAAAALKloC+zpqH/ycC9/vXw7v7m2dT/5dfT/q5qUP6sYkb/7puF/u+S
+        d//ukHH+7pRy/u+YdP7vnXb/76J4/vCnef7vp3P/7Z9g/u6kY/7up2X/76pn/vG1fP7xs3r/8K53/u+p
+        c/7uom//7ptr/u2UZv7tjGH/7IVc/ut+WP/qd1T+6nJQ/ultTf/rd1r+4ox1/plWP/+qdGH+2sW+/tvH
+        wP/w6ef+wrax/qqYkf+pl5AtAAAAAAAAAAAAAAAAAAAAALOmoS+zpqH/ycC9/vXw7/7n2tb/5tnU/q9r
+        UP6sYkb/7pyF/u+Uev/ukXP+7pR0/u+Ydv7vnHf/76B5/u+jd/7tlV3/7Zld/u2dX/7uoGH/76ht/vGx
+        fP7xrnr/8Kp3/u+mc/7vn2//7plr/u2SZ/7ti2L/7IRe/ut9Wf/qd1X+6nJS/upuT//reVz+4o11/plW
+        P/+qdGH+2sa+/tvIwf/w6ef+wrax/qqYkf+pmJEtAAAAAAAAAAAAAAAAAAAAALOmoS+zpqL/ycC9//Xx
+        7//o29f/59rV/69rUP+tYkb/7pyG/++VfP/vkXb/75R2/++Xd//wm3j/7555/+yOXv/sjVb/7JJZ/+yW
+        W//tmV3/8Kl2//Cse//wqnn/76Z2/++ic//unG//7pZr/+6QZ//timP/7INf/+x9W//reFf/6nNT/+pw
+        Uf/re1//4o12/5pXP/+rdWL/28e//9zJwf/x6uf/w7ax/6qZkv+qmJEtAAAAAAAAAAAAAAAAAAAAALOm
+        oi+0p6L/ysG9/vXx7/7o3Nj/59vW/rBrUf6tY0b/7pyH/u+Wfv/uknj+75R4/u+WeP7vmnn/7Yxj/uqB
+        UP7rhlP/64tV/uyOV/7tlV//8Kh7/vCnev7wpXj/76J1/u6dcv7umW//7ZNr/u2OZ/7tiGP/7IJf/ux9
+        XP/reFj+6nRV/upyVP/sfWH+4o12/ppXP/+rdWL+28jA/tzJwv/x6uf+w7ax/qqZkv+qmJEtAAAAAAAA
+        AAAAAAAAAAAAALOmoi+0p6L/ysG9/vXx8P7p3dn/6NzX/rBsUf6uY0b/752I/u+XgP/vknn+75R6/u+W
+        ev7ujm3/6ndL/up7Tf7rf0//6oNR/uuGU/7umGr/76N6/u+ief7voHf/7511/u6acv7ulW//7pBr/u2L
+        aP7thmT/7IFh/ut9Xf/qeFr+6nZY/ut0V//sf2T+4o12/ppXP/+sdWL+28jB/tzKwv/x6uf+w7ax/quZ
+        kv+qmJItAAAAAAAAAAAAAAAAAAAAALSnoi+0p6P/ysG+//by8P/q3tr/6d3Y/7FsUv+uY0f/756I//CZ
+        hP/vk3z/75R7/++Sdv/pcUr/6XFH/+p1Sf/qeUv/63xN/+t/UP/vnXj/8J96/++eeP/vnHf/75l0/+6W
+        cf/ukm//7o5r/+2JaP/thWX/7IBi/+x8X//reVz/63hb/+t3Wf/sgWb/4o52/5tXP/+sdmL/3MnB/93L
+        w//x6+j/w7ax/6uak/+rmZItAAAAAAAAAAAAAAAAAAAAALOnoy+0p6P/ysG+/vby8f7q39v/6d7Z/rFs
+        Uv6uZEf/756J/vCchv/vlX7+75R8/upxUP7oaEP/6WtE/ulvRv7pckj/6nVJ/uyDW/7wnHv/75t5/u+a
+        eP7vmHb/75Z0/u6Tcf7uj2//7Yts/u2Iaf7shGb/7IBj/ux9Yf/re1/+63pe/ut5XP/tg2n+4453/ptY
+        P/+tdmP+3MrC/t3LxP/x6un+w7ay/quak/+qmZItAAAAAAAAAAAAAAAAAAAAALSnoy+0qKP/ysG+//by
+        8f/r4Nz/6t/a/7FsUv+vZEf/75+K//Ceif/wmIL/63te/+hiP//oZED/6GdC/+lpQ//pbEX/6W5G/+6O
+        bf/wmXr/8Jh5/++XeP/vlXb/75N0/+6Qcv/ujW//7Ypt/+2Hav/tg2f/7IBl/+x/ZP/sfmL/7H1h/+x7
+        X//thWv/4453/5xYQP+td2P/3cvD/97Mxf/x6+n/w7ey/6uak/+rmpMtAAAAAAAAAAAAAAAAAAAAALSn
+        oy+1qKT/ysG+/vby8f7r4d3/6uDc/rJtUv6vZEf/76CL/vGgjP/tiXD+6GE//udgPv7oYT//52M//uhl
+        Qf7oZ0L/6W9L/u+We/7vlnv/75Z6/u6UeP7vk3f/7pF1/u6Oc/7ujHD/7Ylt/u2Ga/7thGr/7INo/u2C
+        Z//sgGX+7H9k/ux+Yv/tiG7+4453/pxYQP+ud2T+3cvE/t7Nxv/x6+n+w7ey/qualP+rmpMtAAAAAAAA
+        AAAAAAAAAAAAALSooy+1qKT/y8G//vbz8v7s4t7/6+Hd/rJtUv6wZEf/76CM/vCchv/oZkX+52A+/udg
+        Pv7oYT//52E+/udhP/7oYj//635g/u+Vff7vlXz/75R7/u+Tef7vkXj/7o92/u6Nc/7ui3L/7Ylw/u2I
+        bv7th23/7YVr/u2Eav/sg2j+7IFn/uyAZf/uinH+4494/p1YQP+ud2T+3szG/t/Nx//y6+n+w7ez/qyb
+        lP+rmpMtAAAAAAAAAAAAAAAAAAAAALWopC+1qaT/y8K///fz8v/t49//7OHe/7NuUv+wZEf/76CL/+t3
+        Wf/oYT//6GE//+hhP//oYT//6GE//+hhP//oYkD/75B4/++Wf//vlX7/75R8/++Se//vkXn/75B4/+6O
+        dv/ujXT/7otz/+6Kcf/uiXD/7ohu/+2Hbf/thWv/7YRq/+2DaP/ujHT/4494/51ZQP+veGX/383H/9/O
+        yP/y7Or/w7iz/6yblP+rmpQtAAAAAAAAAAAAAAAAAAAAALSopC+1qaT/y8K//vf08v7t5OD/7OLf/rNu
+        Uv6wZUf/7ZB4/uloSP/nYD7+52A+/udgPv7oYT//52A+/udgPv7qcVP/8JmE/u+Ygv7wl4D/75V//u+U
+        fv7vk3z/7pJ6/u6Qef7vj3f/7o52/u6NdP7ujHP/7Ypx/u6JcP/tiG7+7Ydt/u2Fa//uj3f+4494/p5Z
+        QP+veWX+387I/uDPyf/y7Or+w7iz/qyblf+rmpQtAAAAAAAAAAAAAAAAAAAAALSopC+1qaX/y8K//vf0
+        8v7u5OH/7ePg/rNuUv6xZUf/7Y93/uloSP/nYD7+52A+/udgPv7oYT//52A+/udhP/7uiXD/8JuG/vCa
+        hf7wmYP/75iC/u+XgP7vln//75R+/u+TfP7vknr/7pF5/u6PeP7ujnb/7o10/u6Lc//tinH+7Ylw/u6I
+        b//vkXn+45B5/p5ZQP+weWX+4M/J/uDQyv/y7Or+xLi0/qyclf+rm5QtAAAAAAAAAAAAAAAAAAAAALWp
+        pS+1qaX/y8K///f08//u5eL/7eTg/7RuUv+xZUf/7Y93/+lsTP/oZ0b/6GdG/+hnRv/oZ0b/6GdG/+ls
+        Tf/xoo7/8aGN//GgjP/xn4v/8J6J//CdiP/wnIf/8JuF//CZhP/wmYL/75eB/++Wf//vlX7/75R9/++T
+        e//ukXr/7pB4/+6Pd//vlX7/45B5/59aQP+wemX/4dDK/+HRy//y7ev/xLi0/6yclv+sm5UtAAAAAAAA
+        AAAAAAAAAAAAALWppS+1qaX/y8O//vj08/7u5uP/7uXh/rRuU/6xZUf/7ZR9/u2Odv/tjnX+7Y51/u2O
+        df7tjnb/7Y51/u6Vfv7wo4//8KOO/vCijv7woo3/8KGN/vChjP7woYz/8KCL/vCgi/7woIv/75+K/u+f
+        iv7vnon/756J/u+eiP/vnYj+752H/u+ch//vnIb+45B5/p9aQf+xemb+4dHL/uLSzP/z7ev+xLm0/q2c
+        lv+sm5UtAAAAAAAAAAAAAAAAAAAAALWppS+2qqX/y8PA/vj18/7v5+P/7uXi/rZyV/6uYkT/tGdK/rRn
+        Sv+0Z0r+s2dK/rNnSv6zZkr/smZK/rJmSv6yZkr/sWZK/rFlSf6xZkn/sGVJ/rBlSf6vZUn/r2VJ/q5k
+        Sf6uZEn/rWRI/q1jSP6sY0j/rGNI/qtiSP+rYkj+qmJH/qliR/+pYUf+p2BH/qBaQf+zfWr+4tLM/uLT
+        zf/z7ev+xLm0/q2dlv+snJYtAAAAAAAAAAAAAAAAAAAAALWqpS+2qqb/y8PA//j19P/v5+T/7+bj/9Cp
+        mf+ya0//sGZJ/7BmSf+wZkn/sGZJ/69mSf+vZkn/r2VJ/65lSf+uZUn/rWVJ/61lSf+tZEj/rGRI/6xk
+        SP+rY0j/qmNI/6pjSP+pY0j/qWJH/6hiR/+oYkf/p2FH/6dhR/+mYUf/pWBH/6VgRv+kYEb/pF9G/6dn
+        T//NrKD/4tPO/+PUz//z7uz/xbm1/62dl/+tnJYtAAAAAAAAAAAAAAAAAAAAALWppS+2qqb/y8PA/vj1
+        9P7w6OX/7+fk/u/m4/7v5uP/7ubi/u7l4v/u5eH+7eTh/u3k4P7t4+D/7OPf/uzi3v7s4t7/6+Hd/uvh
+        3f7r4Nz/6t/b/urf2/7q3tr/6d7Z/und2f7o3Nj/6NzX/ufb1/7n2tb/59rV/ubZ1P/m2dT+5djT/uXX
+        0v/l19L+5NbR/uTV0P/j1c/+49TP/uPV0P/z7uz+xbq1/q2dl/+tnJYtAAAAAAAAAAAAAAAAAAAAALWp
+        pS62qqb/y8PA/vj29P7w6eb/8Ojl/vDo5P7v5+T/7+fk/u/m4//v5uP+7uXi/u7l4v7u5eH/7eTg/u3k
+        4P7t49//7OLf/uzi3v7s4d7/6+Hd/uvg3P7r4Nz/6t/b/urf2v7p3tr/6d3Z/und2P7o3Nj/6NvX/ufb
+        1v/n2tb+59rV/ubZ1P/m2NP+5djT/uXX0v/l19H+5NbR/uXX0v/07+3+xLm0/q6emP+tnZcrAAAAAAAA
+        AAAAAAAAAAAAALaqpg62qqb7vLGu//Xz8//49fT/9/Tz//f08//39PP/9/Tz//f08//39PL/9/Py//fz
+        8v/38/L/9vPx//bz8f/28/H/9vLx//by8P/28vD/9vHw//bx8P/18e//9fHv//Xw7//18O//9fDu//Tw
+        7v/08O7/9O/u//Tv7f/07+3/9O7t//Tu7P/z7uz/8+7s//Pu6//z7ev/8+3r//Pt6//z7+7/taah/66e
+        mPqtnZcMAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqaataml/r2yr/7Px8X/0MjG/tDIxv7QyMX/z8jF/s/I
+        xf/PyMX+z8jE/s/HxP7Px8T/z8fE/s7Hw/7Px8T/zsbD/s7Gw/7OxsP/zsXD/s7Fwv7OxcL/zsXC/s7F
+        wv7NxcL/zcTB/s3Ewf7NxMH/zcTA/s3EwP/Nw8D+zcPA/szDv//Mw7/+zMK//szCv//Mwr7+y8K+/srA
+        vP+2qKP+rp6Y/q6emJYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2qqYLtamloLWppfm2qqb/taml/rWp
+        pf62qqX/taml/rWppf+0qKT+tKik/rSopP61qKT/tKej/rSno/60p6P/s6ei/rOmov60p6L/s6ah/rKm
+        of6zpqH/sqWg/rKloP6ypaD/saSf/rGkn/6ypJ//saOe/rGjnv+wop3+sKKd/rCinP+woZz+r6Gb/rCh
+        m/+voJv+r6Ca/q+gmv+un5n5rp+Zna6emAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWp
+        pRm2qqY8tamlP7WppT+1qaU/tamlP7WppT+0qKQ/tKikP7SopD+0qKQ/tKijP7Snoz+0p6M/s6eiP7Om
+        oj+zpqI/s6ahP7OmoT+zpaE/sqWgP7KloD+ypJ8/sqSfP7Gknz+xo54/saOeP7GjnT+wop0/sKKdP7Ci
+        nD+woZw/r6GbP6+hmz+voJs/r6CaP6+fmjyun5kYAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAA8AAOAA
+        AAAABwAA4AAAAAAHAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+        AADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAAD4AAAAAB8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAA
+        AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+        AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+        AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+        AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+        AAAABwAA+AAAAAAfAAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAC2qqYLtqqmerWppaS1qaWltKikpbSnoqWzpqGlsqSfpbGjnqWwoZylr6Capa6emKWtnZalrJuVpaua
+        k6WqmZKlqZeQpamXj6Wpl4+lqZePpamXj6Wpl4+lqZePpamXj6Wpl4+lqZePpKmXj3mpl48LAAAAAAAA
+        AAAAAAAAAAAAALaqpre+tLD/0crH/9HKx//Rycf/0cnG/9DIxf/Px8T/z8bD/87Fwv/NxMH/zcO//8zC
+        vv/Mwb3/y8C8/8rAu//Kv7r/yr66/8m+uf/Jvrn/yb65/8m+uf/Jvrn/yb65/8m+uf/Jvrj/s6Oc/6mX
+        j7UAAAAAAAAAAAAAAAC2qqYVtqqm/+zo5v/x6uf/7+jl/+7l4v/t4+D/6+Hd/+rf2//o3dj/59rW/+bY
+        1P/l19L/5NXQ/+PUz//j1M//49TP/+PUz//j1M//49TP/+PUz//j1M//49TP/+PVz//i19X/5tnV/+TV
+        0P/l3tv/qZeP/qmXjxMAAAAAAAAAALaqph+2qqb/8O3s/+ri3//Aurf/vbe0/7y1sv+7s7D/urGu/7iv
+        rP+3rar/tquo/7Wqpf+0qKP/s6ei/7Omof+2qKP/zLu1/8K5tf/LwLz/2sW+/9rFvv/axb7/nY+n/yMj
+        q/9xbr3/3MnC/+ni3/+pl4//qZePHgAAAAAAAAAAtqqmH7aqpv/x7ez/4drY/42Liv+LiYj/ioiI/4qI
+        h/+Kh4f/iYeG/4mGhf+IhYT/iIWE/4iEg/+HhIL/h4OC/4uGhP+1qKP/p6Sj/66opv/axr//2sW+/9rF
+        vv+Bd5v/Y2PT/2FfvP/cycL/6eLf/6mXj/+pl48eAAAAAAAAAAC2qqYetqqm//Dt7P/x6+j/8ern//Hp
+        5v/v6OT/7ubi/+3j4P/r4d3/6d7Z/+fb1v/l2NP/49XP/+LSzP/gz8n/3s3G/9zKw//Zxr//2sa//9vH
+        wP/bx8D/28fA/867tv+XjaT/uqux/9zJwv/p4d//qZeP/6mXjxwAAAAAAAAAALaqpgO2qqbo0svI/+zo
+        5//s6Of/7Ojn/+zo5//s6Ob/6+fm/+vn5f/r5uX/6uXk/+rl4//p5OL/6ePh/+ji4P/n4d//5+De/+bg
+        3f/m39z/5t7c/+Xe2//l3tv/5d7b/+Xd2v/l3dr/5d3a/8m+uP+pl4/mqZePAgAAAAAAAAAAAAAAALaq
+        pkC1qaXgtqqm/7aqpv+2qqb/tqqm/7aqpv+2qqb/tqqm/7aqpv+1qaX/tKik/7Sno/+zpqH/sqSf/7Gj
+        nv+woZz/r6Ca/66emP+tnZf/rJuV/6uak/+qmZL/qZiR/6mXkP+pl4//qZeP4KmXjz8AAAAAAAAAAAAA
+        AAAAAAAAAAAAALKloAmypKAxsqSfM7KknzOxo54zsaOeM7GjnjOxo50zsKKdM7CinTOwoZwzr6CbM6+g
+        mjOun5kzrZ6YM62dlzOsnJYzrJuVM6ualDOqmZMzqpmSM6mYkTOpl5AzqZePM6mXjzGpl48IAAAAAAAA
+        AAAAAAAAAAAAAAAAAACwoZxTsKGc8a+hm/+voJr/r5+a/66fmf+unpj/rp6Y/62dl/+tnZf/rZyW/6yc
+        lf+sm5X/rJuU/6ualP+rmpP/q5qT/6uZkv+qmZL/qpiR/6qYkf+qmJH/qZeQ/6mXkP+pl5D/qZeP/6mX
+        j/Cpl49RAAAAAAAAAAAAAAAAsKKdBbCine/UzMn/7efl/+3n5f/s5uT/7Obk/+zm5P/s5eP/7OXj/+zl
+        4//s5eL/6+Xi/+vl4v/r5OL/6+Th/+vk4f/r5OH/6+Th/+vk4f/r5OH/4N7X/7fStP+51Lb/2t/U/+vk
+        4f/r5OH/z8XB/6mXj+6pl48EAAAAAAAAAACxo50fsaOd/+zm5P/h0cz/4M/K/+DPyf/fzsj/3s3G/97M
+        xf/dy8T/3cvD/93Kw//cycL/3MnB/9vIwf/byMD/28e//9rGv//axr//2sa//9rGv/+zsJ7/SbBS/0qz
+        U/+cuJD/2sa//9vHwP/p4t//qZeP/6mXjx0AAAAAAAAAALGjnh+xo57/7Ofl/+LSzP/XvrX/vo17/7uK
+        d/+6iXb/uoh2/7mIdf+4h3X/t4Z0/7eGdP+2hXP/toVz/7WEc/+0hHL/tINy/7ODcf+zgnH/s4Jx/7GB
+        cP+rfGv/q3xr/7OEdf/Rtqz/2sa//+ni3/+pl5D/qZePHgAAAAAAAAAAsaSeH7Kkn//s5+X/49PO/7+O
+        e/+uZUr/v3Ra/751W/++d1v/vXld/718Xv+9fmD/vIBg/7yBYf+7gWH/u4Bg/7p+X/+6e17/uXhc/7h1
+        W/+4cln/t3BY/7duV/+2blf/n1tE/7qPgf/axr//6eLf/6mXkP+pl5AeAAAAAAAAAACypJ8fsqSf/+3o
+        5f/k1dD/vox6/8BzWf/vlHn/7pR0/++bd//vpHv/8K1///G1g//yvYb/8b+A//G+ff/xvYL/8bV///Cr
+        ef/uoHL/7ZVr/+2LZf/sgV//63la/+yDZ/+sZk//uo+A/9rGv//p4t//qZeQ/6mXkB4AAAAAAAAAALKl
+        oB+ypaD/7ejm/+XW0f+/jXv/wHRa/++TeP/tjmz/7pVv/+6ecv/vp3b/8bB6//Czdf/vtGv/77Zu//C4
+        ef/wrnP/76Ns/+2XZf/si13/639V/+p0T//pa0n/7H1h/6xmT/+6j4D/2sa//+ni3/+qmJH/qZeQHgAA
+        AAAAAAAAsqWgH7OloP/u6Of/5tjT/8COe//BdFr/75Z8/+6QcP/vl3L/7551//CneP/wrHf/7qdl/++s
+        Z//ws3P/8LR6//CsdP/vom7/7Zdn/+2LX//sgFj/6nVS/+ltTP/sf2P/rWZP/7qPgP/axr//6eLf/6qY
+        kf+qmJEeAAAAAAAAAACzpqEfs6ah/+7p5//m2dX/wY98/8J0Wv/vl3//7pFz/++Xdf/vnXf/76N4/+2Z
+        Yf/tnl//7qNi//Gxef/wrnn/76h0/+6fbv/tlGj/7Iph/+t/Wv/qdlT/6m9P/+yBZv+tZ0//upCA/9vH
+        wP/p4t//qpiR/6qYkR4AAAAAAAAAALOmoR+zpqH/7uno/+fb1v/CkH3/wnRa/++Zgf/vknb/75Z3/++c
+        ef/sj2H/641W/+yTWv/unGT/8Kt7//CoeP/vonP/7ppu/+6RaP/tiGL/7H5c/+t2Vv/qcVL/7INo/65n
+        T/+7kYH/28jB/+ni3/+qmZL/qpiRHgAAAAAAAAAAs6aiH7Snov/u6uj/6NzY/8ORfv/CdFr/8JuE/++T
+        ef/vlnn/7Yto/+p7Tf/rglH/64dT/+6cbv/vpHr/76F3/++bc//ulW7/7Y1o/+yFY//rfl7/63dZ/+t0
+        Vv/thmv/rmdP/7yRgf/cycL/6eLg/6uZkv+qmZIeAAAAAAAAAAC0p6IftKei/+/q6f/p3tr/w5J//8N1
+        Wv/wnYj/75R8/+6Ocv/pbkf/6nJI/+p4S//rflD/7515/++deP/vmnb/75Zy/+6Qbv/timn/7IRl/+x9
+        YP/reV3/63hb/+2Ibv+vZ0//vJKC/9zKw//q4+D/q5qT/6uZkh4AAAAAAAAAALSnox+0p6P/7+vp/+rf
+        2//Ekn//w3Va//GgjP/vlH3/6WpJ/+hmQf/pakT/6W5G/+yCXf/wmXr/75h4/++Vdv/ukXL/7o1v/+2I
+        a//sgmb/7H9j/+x9Yf/se1//7Ypx/69oUP+9k4P/3cvE/+rj4f+rmpP/q5mTHgAAAAAAAAAAtKijH7So
+        o//v6+n/6+Hd/8WTgP/EdVr/8aOP/+t1WP/oYT//6GE//+hjQP/oZkH/7o5y/++We//vlHn/7pJ2/+6O
+        c//ui3D/7Ydt/+2Eav/tgmj/7IFl/+x/Y//ujXT/sGhQ/76ThP/ezMX/6uPh/6ualP+rmpMeAAAAAAAA
+        AAC0qKQftaik/+/r6v/s4t7/xZSA/8R1Wv/ujnb/6GE//+hhP//oYT//6GE//+lsTP/vln//75R9/++T
+        e//vkXj/7o52/+6Mc//uinH/7Yhv/+2GbP/thGr/7YNo/+6Pd/+waFD/v5SF/9/Ox//q5OH/rJuU/6ua
+        lB4AAAAAAAAAALWopB+1qaT/8Ozq/+3j4P/GlYH/xHZa/+pzVP/oYT//6GE//+hhP//oYT//7YNo//CZ
+        g//wl4H/75V//++TfP/vkXr/75B4/+6Odv/ujHP/7opx/+6Ib//thm3/7pJ6/7FoUP+/lYb/4M/J/+rk
+        4v+sm5X/rJuUHgAAAAAAAAAAtamkH7Wppf/w7Ov/7uXh/8eVgv/Fdlr/6nRW/+hlQ//oZUP/6GVD/+hn
+        Rv/wnYj/8Z+K//CdiP/wm4b/8JqE//CYgv/vloD/75R9/++Te//vkXn/7o93/+6Ndf/vlX7/smlQ/8CW
+        h//h0Mv/6+Xi/6yclf+sm5UeAAAAAAAAAAC1qaUftaml//Ds6//u5uL/x5aC/79wVP/chGr/3INp/9yD
+        af/cg2n/3IZt/92Rev/dkHn/3ZB5/92PeP/cj3j/3I53/9yOd//cjXb/24x2/9uMdf/bi3X/24t0/9qK
+        cv+tZUz/wZeI/+LSzP/r5eP/rZyW/6yclR4AAAAAAAAAALWppR+2qqX/8O3s/+/n5P/VsqT/sGdK/69l
+        R/+vZUf/rmVH/65kR/+tZEf/rWRH/6xjR/+rY0b/q2JG/6piRv+pYkb/qGFG/6dhRf+nYEX/pmBF/6Vf
+        Rf+kX0T/o15E/6RhSP/Pr6T/4tPO/+vl4/+tnZf/rZyWHgAAAAAAAAAAtqqmH7aqpv/w7ez/8Ojl/+/n
+        5P/v5uP/7uXi/+7l4f/t5OH/7ePg/+zj3//s4t7/6+Hd/+vg3P/q39v/6t7a/+nd2f/o3Nj/6NzX/+fb
+        1v/n2tX/5tnU/+XY0//l19L/5NbR/+TV0P/j1dD/6+bk/62dl/+tnZceAAAAAAAAAAC2qqYQtqqm/ejk
+        4//18e//9fDu//Xw7v/07+7/9O/t//Tv7f/07uz/8+7s//Pt6//z7ev/8+zq//Ls6v/y6+n/8evp//Hq
+        6P/x6uf/8Onn//Dp5v/w6OX/7+jl/+/n5P/v5uT/7ubj/+7m4//k3tv/rp6Y/K2dlw4AAAAAAAAAAAAA
+        AAC2qqabua2q/8e+u//Hvrv/x766/8a9uv/Gvbr/xr25/8a9uf/Gvbn/xry5/8a8uP/Fu7j/xbu3/8W7
+        t//Furb/xLq2/8S5tv/EubX/w7m1/8O4tP/DuLT/w7iz/8O3s//Ct7L/wbax/7Kjnf+unpiXAAAAAAAA
+        AAAAAAAAAAAAALaqpgK2qqZStqqmfrWqpX+1qaV/tamlf7WppH+1qKR/tKijf7Sno3+0p6J/s6eif7Om
+        on+zpqF/s6Wgf7KloH+ypJ9/saSff7Gjnn+xo55/sKKdf7CinH+woZx/r6Gbf6+gmn+voJp+rp+ZUa6e
+        mQEAAAAAAAAAAMAAAAPAAAADgAAAAYAAAAGAAAABgAAAAYAAAAHAAAAD4AAAB8AAAAOAAAABgAAAAYAA
+        AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+        AAGAAAABgAAAAcAAAAPAAAADKAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AACpnpoItamli7Wppbu1qaW8tKejvLOmobyypJ+8sKKcvK+gmrytnpi8rJyVvKuak7yqmJG8qZeQvKmX
+        j7ypl4+8qJaOvKmXj7ypl4+8qJaOu6mXj4qikYkHAAAAAAAAAAC2qqZ0zsbD/unj4f/o4uD/5+De/ubf
+        3P/l3dr/5NzZ/uPa1//i2dX/4djU/+HY1P7h19T/4dfT/uHX0//h19P/4dfT/uHX0//h19P/4dfT/sS4
+        sv+pl49zAAAAAAAAAAC1qaWX4dza/uTb2P7Jwr/+x7+8/sW8uP7DubX+wray/sCzrv6+sav+va+p/ryt
+        qP7LubP+x7q1/tHCvf7ZxL3+2cS9/paJrf5fXLr+1sXE/tnPy/6olo6WAAAAAAAAAAC2qqaX4tzb/tbQ
+        zv+koaD/o6Ce/qOfnf+inZv/oZua/p+amP+emJb/nZeU/5yVkv62qaT/raak/sC0sP/axb7/2cS9/oF4
+        pP9gX8P/x7a7/tnPy/+pl4+WAAAAAAAAAAC2qqaJ29XT/vXx7//18e//9fDu/vTu7P/y7Or/8ern/u/o
+        5f/u5eL/7OPf/+rg3P7p3tr/6NzY/ufb1v/n29b/59vW/uPX0//Zzsz/6NvX/tLIw/+pl4+IAAAAAAAA
+        AAC1qaUgtqqm172yrv69sq7+vbKu/r2yrv69sq7+vbKu/ryxrf67sKz+uq6q/rmtqP64q6b+tqmk/rWn
+        of60pZ/+s6Od/rKinP6xoZr+saCZ/qmXj9epl48fAAAAAAAAAAAAAAAAsaSfLrGjnmWxo55msaKdZrCi
+        nWawoZxmr6GbZq+gm2auoJpmrp6ZZq2dmGatnJZmrJuVZqualGaqmZJmqpiSZqmXkGapl5BmqJaPZamX
+        jy4AAAAAAAAAAAAAAACwopxHuq2o/M7Fwf/OxMH/zsTA/s3EwP/Nw7//zcO//s3Cvv/Mwr7/zMG9/8zB
+        vf7Lwbz/y8C8/svAu//LwLv/yb+6/sm/uv/Kv7r/yr+6/rOjnPypl49GAAAAAAAAAACxop2U3NTS/uTV
+        0P7j1M7+4tPN/uHSzP7h0cr+4NDJ/uDPyP7fzsj+383H/t7Nxv7ezMX+3svF/t7Lxf7cysT+VqhZ/k6v
+        Vf7VysD+3szG/tjOyv6olo+SAAAAAAAAAACxo56X3dbT/uLSzP/Bk4L/tn5q/rR+af+zfWj/snxo/rF7
+        Z/+wemb/sHpm/695Zv6ueWX/rXhl/qx3Zf+sd2X/p3Nh/qdzYf+5jn//2sa//tnPy/+pl4+WAAAAAAAA
+        AACypJ+X3tbU/uPUzv+qZEr/3Ypx/t2Ocf/dlXT/3p14/t+lfP/fq37/3qx7/96pfP7doXj/3Jhz/tuO
+        bf/ahmj/2X5k/tV/Z/+gZVD/2sa//tnPy/+pl5CWAAAAAAAAAACypKCX3tfU/uTW0f+sZUv/7pR6/u6P
+        bP/umXD/76V1/vCxev/vtHD/77Zu//C2eP7vqXD/7Zlm/uyIW//qeVL/6WxK/uaAZf+hZVD/2sa//tnP
+        y/+pl5CWAAAAAAAAAACypaCX39jV/uXY0/6tZkv+7pd9/u6Rcf7vmnT+76V4/u+ocP7uqGX+77Fx/vCy
+        ef7vp3H+7Zho/uyJXv7relX+6W9N/uaBZ/6hZVD+2sa//tnPzP6pmJGWAAAAAAAAAACzpqGX39jW/ufa
+        1f+uZ0v/75iA/u+Sdf/vmnf/7pxy/uyTWv/tm17/8Kx2//CqeP7voXH/7pRp/uyHYP/relj/6nFR/ueD
+        av+iZlD/28fA/tnQzP+qmJGWAAAAAAAAAACzpqKX4NnW/ujc1/6vZ0v+75qD/u+Tef7vlXb+64BT/uuF
+        Uv7skF3+8KV6/u+hdv7umXD+7o9p/uyEYv7relv+6nRW/ueGbP6jZlD+3MnB/trQzP6qmZKWAAAAAAAA
+        AAC0p6KX4NnX/une2v+waEz/75yH/u+UfP/rd1X/6XBH/up3Sv/tj2f/75x5/++Zdf7uknD/7Ytq/uyC
+        ZP/re1//63hc/ueIb/+kZ1H/3crD/trQzf+rmZKWAAAAAAAAAAC0p6OX4NrY/uvg3P+waEz/8J+L/ux/
+        ZP/oYj//6GZB/ulsRv/vlXf/75Z5/++Tdf7ujnH/7Yhs/uyDZ//sgGT/7H1h/uiKcv+lZ1L/3szE/trR
+        zv+rmpOWAAAAAAAAAAC0qKSX4drY/uzi3v6xaU3+7pV+/uhiQP7nYD7+52E//up1Vv7vlX3+75N7/u6Q
+        d/7ujXT+7Ypx/u2Hbf7thWr+7IJn/uiNdf6maFL+383H/trRzv6rmpSWAAAAAAAAAAC1qKSX4dvZ/u3j
+        4P+yaU3/63xf/uhhP//oYT//52E//u6Mc//wmIP/75aA/++Uff7vkXr/7o93/u6MdP/uinH/7Ydu/umQ
+        eP+naVL/4M/J/tvSz/+sm5WWAAAAAAAAAAC1qaWX4dvZ/u7l4v+yaU3/7Idt/ut6Xv/rel7/635i/vCi
+        jv/woYz/8J+L//Ceif7wnIf/75uF/u+Zg//vmIH/75Z//umUfv+oalP/4dHL/tvTz/+snJWWAAAAAAAA
+        AAC1qaWX4dza/u/m4/66emH+smdK/rJnSv6xZ0r+sGZK/rBmSv6vZUn+rmVJ/q1kSf6sY0j+q2NI/qpi
+        SP6pYkj+p2FH/qZgRv6ye2b+4tPN/tzT0P6tnJaWAAAAAAAAAAC2qqaX4tza/vDo5f/v5+T/7+bj/u7l
+        4v/t5OH/7ePg/uzi3v/r4d3/6+Dc/+rf2/7p3tn/6NzY/ufb1v/n2tX/5tjU/uXX0v/k1tH/5NXQ/tzU
+        0f+tnZeVAAAAAAAAAAC2qqZpycC9/uPe3P/j3tz/497c/uPe2//j3dv/493a/uLc2v/i3Nr/4tvZ/+Lb
+        2f7h29j/4drY/uHa1//g2df/4NnW/uDY1f/f2NX/39fU/sO3s/+tnphnAAAAAAAAAAConZkCtamlbbWp
+        pZ61qaWftamln7SopJ+0qKSftKejn7Onop+zpqKfs6ahn7KloJ+ypaCfsaSfn7Gjnp+xop2fsKKcn7Ch
+        nJ+voJufr6Canq6fmWuklZACAAAAAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwCAAAEAgAABAIAA
+        AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABACgA
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuKyoj8O5ttLCuLXSwbay0r+0
+        sNK+sa3SvK+q0rutp9K5q6XSuaqk0rmqpNK5qqTSuaqj0quako4AAAAAW1VTDdLKx//j29n/1c3K/9LJ
+        xv/QxcH/zcG8/8y+uf/Mvbn/1cfC/9vLxv/ezMb/oZe+/8W5yf/Iu7b+X1RQDFtVUw/Ty8n/1M/M/725
+        t/+8trT/urOw/7evrP+1rKj/tKml/8S3sv/Pv7n/2sa//5KIsv+1p7z/yby3/19UUA4AAAAAvbKuwtHJ
+        xv/Rycb/0cnG/9DIxf/Px8T/zsXC/83Dv//LwLz/yr66/8i8uP/Hu7b/x7q1/7GgmcEAAAAAAAAAALGj
+        nlOwop2YsKGcma+gm5mvoJqZrp+Zma2emJmsnJaZrJuUmauak5mqmJGZqZeQmamXj5ipl49SAAAAAFhR
+        TgnIvrr759zY/+ba1v/l2dX/5djT/+TX0v/j1tH/49bQ/+LV0P/i1dD/pcSf/57Im//i1dD/wrWv+l9U
+        UAhYUU8Pz8XC/9a8s/+5fGb/vH9p/7uBaf+6g2r/uYNq/7iBaf+2fmf/tXtm/7J3Y/+tcl//0LSr/8m8
+        t/9fVFAPWVJPD9DGw//RsaX/14Rp/+6Vcv/vpXn/8bV+//C6dv/xtnv/7qFv/+yKYf/qdlT/zHNa/8qq
+        n//Jvbj/X1VRD1lSUA/Qx8T/07So/9iFa//ulHL/76F3/+6iZ//vrW3/8K53/+6ba//shV3/6nJQ/8xz
+        Wv/Kq6D/yb24/19VUQ9ZU1AP0cjF/9W2qv/Zh27/75R4/+2MZP/rilX/76Jy/++hdf/uk2v/7IJg/+p1
+        Vv/Ndlz/y62h/8q+uf9fVVIPWlNRD9HJxv/XuK3/2opy/+2Ibf/pbEX/6npQ/++bef/vlnT/7Yxs/+yB
+        Y//rel7/znhg/82uo//Kvrr/YFZSD1pUUQ/Sycf/2Luv/9qHbv/oZkX/6GE//+x9YP/vlHv/7pB2/+2K
+        cP/thWv/7IJn/897Y//OsKb/y7+7/2BWUw9aVFIP0srH/9q8sf/XdVj/6GNB/+hjQv/vln//8JmD/++W
+        f//vknv/7o52/+6Lcv/Qfmb/0LOo/8vAvP9gV1MPWlRSD9PLyP/exbv/v3BU/8V0WP/FdFn/xXpg/8R5
+        X//DeF//wnde/8F2Xf/AdVz/tGtT/9W7sv/Mwb3/YVdUD1tVUwzRycb+8uzp//Hr6P/x6uf/8Onm/+/n
+        5P/u5uP/7eXh/+3j4P/s4t7/6+Dc/+rf2v/p3dn/y8C7/mFYVQsAAAAAtqqne760sL6+s7C/vbOvv72y
+        rr+8sa2/vLCsv7ywq7+7r6q/uq6pv7qtqL+5rKe/uKumvq+gmnoAAAAAgAEAAAAAAAAAAAAAgAEAAIAB
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+</value>
+  </data>
+</root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Editors/Maestro.Editors.csproj	2010-10-25 06:57:06 UTC (rev 5323)
@@ -112,6 +112,12 @@
     <Compile Include="Common\UnmanagedFileBrowser.Designer.cs">
       <DependentUpon>UnmanagedFileBrowser.cs</DependentUpon>
     </Compile>
+    <Compile Include="Diagnostics\ServerStatusMonitor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Diagnostics\ServerStatusMonitor.designer.cs">
+      <DependentUpon>ServerStatusMonitor.cs</DependentUpon>
+    </Compile>
     <Compile Include="DrawingSource\DrawingSourceEditorCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -633,6 +639,9 @@
       <DependentUpon>UnmanagedFileBrowser.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Diagnostics\ServerStatusMonitor.resx">
+      <DependentUpon>ServerStatusMonitor.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="DrawingSource\DrawingSourceEditorCtrl.resx">
       <DependentUpon>DrawingSourceEditorCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1437,6 +1437,15 @@
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Last Updated: .
+        /// </summary>
+        internal static string LastUpdated {
+            get {
+                return ResourceManager.GetString("LastUpdated", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap layer {
             get {
                 object obj = ResourceManager.GetObject("layer", resourceCulture);
@@ -1629,6 +1638,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to No site service available.
+        /// </summary>
+        internal static string NoSiteService {
+            get {
+                return ResourceManager.GetString("NoSiteService", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to You must select at least one type.
         /// </summary>
         internal static string NoTypesSelected {
@@ -2117,6 +2135,33 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to KB.
+        /// </summary>
+        internal static string UnitsKb {
+            get {
+                return ResourceManager.GetString("UnitsKb", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ms.
+        /// </summary>
+        internal static string UnitsMs {
+            get {
+                return ResourceManager.GetString("UnitsMs", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to s.
+        /// </summary>
+        internal static string UnitsSeconds {
+            get {
+                return ResourceManager.GetString("UnitsSeconds", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Unknown types.
         /// </summary>
         internal static string UnknownResourceTypes {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-10-25 06:57:06 UTC (rev 5323)
@@ -971,4 +971,19 @@
   <data name="SpecifySecondaryFeatureSource" xml:space="preserve">
     <value>Please specify the secondary feature source</value>
   </data>
+  <data name="LastUpdated" xml:space="preserve">
+    <value>Last Updated: </value>
+  </data>
+  <data name="UnitsKb" xml:space="preserve">
+    <value>KB</value>
+  </data>
+  <data name="UnitsMs" xml:space="preserve">
+    <value>ms</value>
+  </data>
+  <data name="UnitsSeconds" xml:space="preserve">
+    <value>s</value>
+  </data>
+  <data name="NoSiteService" xml:space="preserve">
+    <value>No site service available</value>
+  </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/Maestro.Login/LoginDialog.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -95,8 +95,18 @@
             base.OnLoad(e);
             rdHttp.Checked = true;
 
+            var isNativeApiAvailable = false;
+            var providers = ConnectionProviderRegistry.GetProviders();
+            foreach (var prv in providers)
+            {
+                if (prv.Name.Equals("MAESTRO.LOCALNATIVE"))
+                {
+                    isNativeApiAvailable = true;
+                    break;
+                }
+            }
             //Mono = No LocalNativeConnection for you (for now...)
-            if (Platform.IsRunningOnMono)
+            if (Platform.IsRunningOnMono || !isNativeApiAvailable)
             {
                 rdTcpIp.Enabled = false;
             }
@@ -217,7 +227,7 @@
                     else //Native
                     {
                         System.Data.Common.DbConnectionStringBuilder builder = new System.Data.Common.DbConnectionStringBuilder();
-                        builder["WebConfig"] = _local.WebConfigPath;
+                        builder["ConfigFile"] = _local.WebConfigPath;
                         builder["Username"] = _local.Username;
                         builder["Password"] = _local.Password;
                         builder["Locale"] = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName;

Modified: sandbox/maestro-3.0/MaestroAPITests/CapabilityTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/CapabilityTests.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/MaestroAPITests/CapabilityTests.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -123,7 +123,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {
@@ -260,7 +260,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {
@@ -390,7 +390,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {
@@ -513,7 +513,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {
@@ -633,7 +633,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {
@@ -753,7 +753,7 @@
                         break;
                 }
             }
-            Assert.IsTrue(caps.SupportsResourcePreviews);
+            Assert.IsTrue(caps.SupportsResourcePreviewUrls);
             int[] services = caps.SupportedServices;
             foreach (ServiceType st in Enum.GetValues(typeof(ServiceType)))
             {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -20,40 +20,156 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
 
 namespace OSGeo.MapGuide.MaestroAPI.Capability
 {
     public abstract class ConnectionCapabilities : IConnectionCapabilities
     {
-        private static readonly Version V_1_0_0 = new Version(1, 0, 0);
+        protected IServerConnection _parent;
 
+        protected ConnectionCapabilities(IServerConnection parent)
+        {
+            _parent = parent;
+        }
+
         public virtual Version GetMaxSupportedResourceVersion(ResourceTypes resourceType)
         {
-            return V_1_0_0;
+            Version ver = new Version(1, 0, 0);
+            switch (resourceType)
+            {
+                case ResourceTypes.ApplicationDefinition:
+                    if (!SupportsFusion())
+                        throw new UnsupportedResourceTypeException(ResourceTypes.ApplicationDefinition);
+                    break;
+                case ResourceTypes.LayerDefinition:
+                    ver = GetMaxLayerDefinitionVersion();
+                    break;
+                case ResourceTypes.LoadProcedure:
+                    ver = GetMaxLoadProcedureVersion();
+                    break;
+                case ResourceTypes.WebLayout:
+                    ver = GetMaxWebLayoutVersion();
+                    break;
+                case ResourceTypes.SymbolDefinition:
+                    if (!SupportsAdvancedSymbols())
+                        throw new UnsupportedResourceTypeException(ResourceTypes.SymbolDefinition);
+                    else
+                        ver = GetMaxSymbolDefinitionVersion();
+                    break;
+            }
+            return ver;
         }
 
+        protected virtual bool SupportsAdvancedSymbols()
+        {
+            return (_parent.SiteVersion >= new Version(1, 2));
+        }
+
+        protected virtual bool SupportsFusion()
+        {
+            return (_parent.SiteVersion >= new Version(2, 0));
+        }
+
+        protected virtual Version GetMaxLoadProcedureVersion()
+        {
+            if (_parent.SiteVersion >= new Version(2, 2))
+                return new Version(2, 2, 0);
+
+            if (_parent.SiteVersion >= new Version(2, 0))
+                return new Version(1, 1, 0);
+
+            return new Version(1, 0, 0);
+        }
+
+        protected virtual Version GetMaxSymbolDefinitionVersion()
+        {
+            if (_parent.SiteVersion >= new Version(2, 0))
+                return new Version(1, 1, 0);
+
+            return new Version(1, 0, 0);
+        }
+
+        protected virtual Version GetMaxWebLayoutVersion()
+        {
+            if (_parent.SiteVersion >= new Version(2, 2))
+                return new Version(1, 1, 0);
+            return new Version(1, 0, 0);
+        }
+
+        protected virtual Version GetMaxLayerDefinitionVersion()
+        {
+            if (_parent.SiteVersion >= new Version(2, 1))
+                return new Version(1, 3, 0);
+            if (_parent.SiteVersion >= new Version(2, 0))
+                return new Version(1, 2, 0);
+            if (_parent.SiteVersion >= new Version(1, 2))
+                return new Version(1, 1, 0);
+            return new Version(1, 0, 0);
+        }
+
         public abstract int[] SupportedCommands
         {
             get;
         }
 
-        public abstract int[] SupportedServices
+        public virtual int[] SupportedServices
         {
+            get
+            {
+                if (_parent.SiteVersion >= new Version(2, 0))
+                {
+                    return new int[] {
+                        (int)ServiceType.Resource,
+                        (int)ServiceType.Feature,
+                        (int)ServiceType.Fusion,
+                        (int)ServiceType.Mapping,
+                        (int)ServiceType.Tile,
+                        (int)ServiceType.Drawing,
+                        (int)ServiceType.Site
+                    };
+                }
+                else //Fusion doesn't exist pre-2.0
+                {
+                    return new int[] {
+                        (int)ServiceType.Resource,
+                        (int)ServiceType.Feature,
+                        (int)ServiceType.Mapping,
+                        (int)ServiceType.Tile,
+                        (int)ServiceType.Drawing,
+                        (int)ServiceType.Site
+                    };
+                }
+            }
+        }
+
+        public abstract bool SupportsResourcePreviewUrls
+        {
             get;
         }
 
-        public virtual bool SupportsResourcePreviews
+        public abstract bool IsMultithreaded
         {
-            get { return false; }
+            get;
         }
 
-        public virtual bool IsMultithreaded
+        public virtual bool IsSupportedResourceType(string resourceType)
         {
-            get { return false; }
+            Check.NotEmpty(resourceType, "resourceType");
+            var ver = _parent.SiteVersion;
+            var rt = (ResourceTypes)Enum.Parse(typeof(ResourceTypes), resourceType);
+            switch (rt)
+            {
+                case ResourceTypes.ApplicationDefinition: //Introduced in 2.0.0
+                    return (ver >= new Version(2, 0));
+                case ResourceTypes.SymbolDefinition: //Introduced in 1.2.0
+                    return (ver >= new Version(1, 2));
+            }
+
+            return true;
         }
 
-        public abstract bool IsSupportedResourceType(string resourceType);
-
         public bool IsSupportedResourceType(ResourceTypes resType)
         {
             return IsSupportedResourceType(resType.ToString());

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -25,13 +25,6 @@
 {
     public enum CommandType : int
     {
-        /// <summary>
-        /// Get v1.0.0 Capabilites document
-        /// </summary>
-        GetCapabilities = 1,
-        /// <summary>
-        /// Get v1.1.0 Capabilites document
-        /// </summary>
-        GetCapabilities2 = 2,
+        
     }
 }

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/GetCapabilities.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/GetCapabilities.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/GetCapabilities.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1,37 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace OSGeo.MapGuide.MaestroAPI.Commands
-{
-    public interface IGetCapabilities : ICommand
-    {
-    }
-
-    public class GetCapabilities : IGetCapabilities
-    {
-        public IServerConnection Parent
-        {
-            get { throw new NotImplementedException(); }
-        }
-    }
-}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviders.xml	2010-10-25 06:57:06 UTC (rev 5323)
@@ -6,10 +6,21 @@
         <Assembly>OSGeo.MapGuide.MaestroAPI.Http.dll</Assembly>
         <Type>OSGeo.MapGuide.MaestroAPI.HttpServerConnection</Type>
     </ConnectionProvider>
+    <!-- 
+    If you want to use the Maestro.LocalNative provider, you need to set up
+    assembly binding redirection by editing Maestro.exe.config. See these links
+    below for more information:
+    
+    http://trac.osgeo.org/mapguide/wiki/maestro/MaestroAPI/MapGuideDotNetApiVersions
+    
+    http://themapguyde.blogspot.com/2010/10/using-maestro-in-native-mode-with.html
+    -->
+    <!--
     <ConnectionProvider>
         <Name>Maestro.LocalNative</Name>
         <Description>Connection using the MapGuide Web API</Description>
         <Assembly>OSGeo.MapGuide.MaestroAPI.Native.dll</Assembly>
         <Type>OSGeo.MapGuide.MaestroAPI.LocalNativeConnection</Type>
     </ConnectionProvider>
+    -->
 </ConnectionProviderRegistry>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -48,9 +48,9 @@
         int[] SupportedServices { get; }
 
         /// <summary>
-        /// Indicates whether previewing capabilities are possible with this connection
+        /// Indicates whether web-based previewing capabilities are possible with this connection
         /// </summary>
-        bool SupportsResourcePreviews { get; }
+        bool SupportsResourcePreviewUrls { get; }
 
         /// <summary>
         /// Indicates if this current connection supports the specified resource type

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-10-25 06:57:06 UTC (rev 5323)
@@ -166,7 +166,6 @@
     <Compile Include="Check.cs" />
     <Compile Include="Commands\CommandType.cs" />
     <Compile Include="Commands\ExecuteLoadProcedure.cs" />
-    <Compile Include="Commands\GetCapabilities.cs" />
     <Compile Include="Commands\ICommand.cs" />
     <Compile Include="Exceptions\CustomPropertyNotFoundException.cs" />
     <Compile Include="Exceptions\MaestroException.cs" />
@@ -266,6 +265,7 @@
     <Compile Include="Services\IResourceService.cs" />
     <Compile Include="IServerConnection.cs" />
     <Compile Include="Services\IService.cs" />
+    <Compile Include="Services\ISiteService.cs" />
     <Compile Include="Services\ITileService.cs" />
     <Compile Include="LengthyOperationCallbackArgs.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1650,6 +1650,8 @@
 
         public abstract string[] GetClassNames(string resourceId, string schemaName);
 
+        public abstract ObjCommon.SiteInformation GetSiteInfo();
+
         public abstract IServerConnection Clone();
     }
 }

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ISiteService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ISiteService.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ISiteService.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.ObjectModels.Common;
+
+namespace OSGeo.MapGuide.MaestroAPI.Services
+{
+    public interface ISiteService : IService
+    {
+        UserList EnumerateUsers();
+
+        UserList EnumerateUsers(string group);
+
+        GroupList EnumerateGroups();
+
+        SiteInformation GetSiteInfo();
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ServiceType.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ServiceType.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/ServiceType.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -31,5 +31,6 @@
         Mapping,
         Tile,
         Fusion,
+        Site
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -28,88 +28,8 @@
 {
     internal class HttpCapabilities : ConnectionCapabilities
     {
-        private IServerConnection _parent;
+        internal HttpCapabilities(IServerConnection parent) : base(parent) { }
 
-        internal HttpCapabilities(IServerConnection parent)
-        {
-            _parent = parent;
-        }
-
-        public override Version GetMaxSupportedResourceVersion(ResourceTypes resourceType)
-        {
-            Version ver = new Version(1, 0, 0);
-            switch (resourceType)
-            {
-                case ResourceTypes.ApplicationDefinition:
-                    if (!SupportsFusion())
-                        throw new UnsupportedResourceTypeException(ResourceTypes.ApplicationDefinition);
-                    break;
-                case ResourceTypes.LayerDefinition:
-                    ver = GetMaxLayerDefinitionVersion();
-                    break;
-                case ResourceTypes.LoadProcedure:
-                    ver = GetMaxLoadProcedureVersion();
-                    break;
-                case ResourceTypes.WebLayout:
-                    ver = GetMaxWebLayoutVersion();
-                    break;
-                case ResourceTypes.SymbolDefinition:
-                    if (!SupportsAdvancedSymbols())
-                        throw new UnsupportedResourceTypeException(ResourceTypes.SymbolDefinition);
-                    else
-                        ver = GetMaxSymbolDefinitionVersion();
-                    break;
-            }
-            return ver;
-        }
-
-        private bool SupportsAdvancedSymbols()
-        {
-            return (_parent.SiteVersion >= new Version(1, 2));
-        }
-
-        private bool SupportsFusion()
-        {
-            return (_parent.SiteVersion >= new Version(2, 0));
-        }
-
-        private Version GetMaxLoadProcedureVersion()
-        {
-            if (_parent.SiteVersion >= new Version(2, 2))
-                return new Version(2, 2, 0);
-
-            if (_parent.SiteVersion >= new Version(2, 0))
-                return new Version(1, 1, 0);
-
-            return new Version(1, 0, 0);
-        }
-
-        private Version GetMaxSymbolDefinitionVersion()
-        {
-            if (_parent.SiteVersion >= new Version(2, 0))
-                return new Version(1, 1, 0);
-           
-            return new Version(1, 0, 0);
-        }
-
-        private Version GetMaxWebLayoutVersion()
-        {
-            if (_parent.SiteVersion >= new Version(2, 2))
-                return new Version(1, 1, 0);
-            return new Version(1, 0, 0);
-        }
-
-        private Version GetMaxLayerDefinitionVersion()
-        {
-            if (_parent.SiteVersion >= new Version(2, 1))
-                return new Version(1, 3, 0);
-            if (_parent.SiteVersion >= new Version(2, 0))
-                return new Version(1, 2, 0);
-            if (_parent.SiteVersion >= new Version(1, 2))
-                return new Version(1, 1, 0);
-            return new Version(1, 0, 0);
-        }
-
         public override int[] SupportedCommands
         {
             get 
@@ -121,36 +41,8 @@
             }
         }
 
-        public override int[] SupportedServices
+        public override bool SupportsResourcePreviewUrls
         {
-            get 
-            {
-                if (_parent.SiteVersion >= new Version(2, 0))
-                {
-                    return new int[] {
-                        (int)ServiceType.Resource,
-                        (int)ServiceType.Feature,
-                        (int)ServiceType.Fusion,
-                        (int)ServiceType.Mapping,
-                        (int)ServiceType.Tile,
-                        (int)ServiceType.Drawing
-                    };
-                }
-                else //Fusion doesn't exist pre-2.0
-                {
-                    return new int[] {
-                        (int)ServiceType.Resource,
-                        (int)ServiceType.Feature,
-                        (int)ServiceType.Mapping,
-                        (int)ServiceType.Tile,
-                        (int)ServiceType.Drawing
-                    };
-                }
-            }
-        }
-
-        public override bool SupportsResourcePreviews
-        {
             get { return true; }
         }
 
@@ -158,21 +50,5 @@
         {
             get { return false; }
         }
-
-        public override bool IsSupportedResourceType(string resourceType)
-        {
-            Check.NotEmpty(resourceType, "resourceType");
-            var ver = _parent.SiteVersion;
-            var rt = (ResourceTypes)Enum.Parse(typeof(ResourceTypes), resourceType);
-            switch (rt)
-            {
-                case ResourceTypes.ApplicationDefinition: //Introduced in 2.0.0
-                    return (ver >= new Version(2, 0));
-                case ResourceTypes.SymbolDefinition: //Introduced in 1.2.0
-                    return (ver >= new Version(1, 2));
-            }
-
-            return true;
-        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -52,7 +52,8 @@
                                         ITileService, 
                                         IMappingService,
                                         IDrawingService,
-                                        IFusionService
+                                        IFusionService,
+                                        ISiteService
 	{
 		private RequestBuilder m_reqBuilder;   
 		
@@ -200,14 +201,14 @@
             }
         }
 
-        [Obsolete("This will be removed in the future. Use ConnectionProviderRegistry.CreateHttpConnection() instead")]
+        [Obsolete("This will be removed in the future. Use ConnectionProviderRegistry.CreateConnection() instead")]
 		public HttpServerConnection(Uri hosturl, string sessionid, string locale, bool allowUntestedVersion)
 			: this()
 		{
             InitConnection(hosturl, sessionid, locale, allowUntestedVersion);
 		}
 
-        [Obsolete("This will be removed in the future. Use ConnectionProviderRegistry.CreateHttpConnection() instead")]
+        [Obsolete("This will be removed in the future. Use ConnectionProviderRegistry.CreateConnection() instead")]
 		public HttpServerConnection(Uri hosturl, string username, string password, string locale, bool allowUntestedVersion)
 			: this()
 		{
@@ -1668,6 +1669,7 @@
                 case ServiceType.Mapping:
                 case ServiceType.Resource:
                 case ServiceType.Tile:
+                case ServiceType.Site:
                     return this;
                 case ServiceType.Fusion:
                     if (this.SiteVersion >= new Version(2, 0))
@@ -1902,5 +1904,14 @@
             else
                 return new HttpServerConnection(new Uri(this.ServerURI), this.SessionID, null, true);
         }
+
+        public override SiteInformation GetSiteInfo()
+        {
+            var req = m_reqBuilder.GetSiteInfo();
+            using (var s = this.OpenRead(req))
+            {
+                return this.DeserializeObject<SiteInformation>(s);
+            }
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1486,5 +1486,19 @@
 
             return m_hosturi + "?" + EncodeParameters(param);
         }
+
+        public string GetSiteInfo()
+        {
+            NameValueCollection param = new NameValueCollection();
+            param.Add("OPERATION", "GETSITEINFO");
+            param.Add("VERSION", "1.0.0");
+            param.Add("SESSION", m_sessionID);
+            param.Add("FORMAT", "text/xml");
+            param.Add("CLIENTAGENT", m_userAgent);
+            if (m_locale != null)
+                param.Add("LOCALE", m_locale);
+
+            return m_hosturi + "?" + EncodeParameters(param);
+        }
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeCapabilities.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeCapabilities.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeCapabilities.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -21,41 +21,31 @@
 using System.Collections.Generic;
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI.Capability;
 
 namespace OSGeo.MapGuide.MaestroAPI.Native
 {
-    public class LocalNativeCapabilities : IConnectionCapabilities
+    public class LocalNativeCapabilities : ConnectionCapabilities
     {
-        public Version GetMaxSupportedResourceVersion(ResourceTypes resourceType)
-        {
-            throw new NotImplementedException();
-        }
+        internal LocalNativeCapabilities(IServerConnection parent) : base(parent) { }
 
-        public bool IsMultithreaded
+        public override int[] SupportedCommands
         {
-            get { return false; }
-        }
-
-        public int[] SupportedCommands
-        {
             get
             {
-                return new int[0];
+                //TODO: Work out what this can/can't do
+                return new int[] 
+                {
+                };
             }
         }
 
-        public int[] SupportedServices
+        public override bool SupportsResourcePreviewUrls
         {
-            get
-            {
-                return new int[] {
-                        (int)ServiceType.Resource,
-                        (int)ServiceType.Feature,
-                };
-            }
+            get { return true; }
         }
 
-        public bool SupportsResourcePreviews
+        public override bool IsMultithreaded
         {
             get { return false; }
         }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -19,32 +19,41 @@
 #endregion
 using System;
 using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.IO;
 using System.Text;
-using OSGeo.MapGuide.ObjectModels.Common;
-using System.Collections.Specialized;
-using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.MaestroAPI.CoordinateSystem;
 using OSGeo.MapGuide.MaestroAPI.Mapping;
-using OSGeo.MapGuide.MaestroAPI.CoordinateSystem;
-using OSGeo.MapGuide.ObjectModels.MapDefinition;
 using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI.Serialization;
+using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels.ApplicationDefinition;
-using System.IO;
-using OSGeo.MapGuide.MaestroAPI.Services;
-using OSGeo.MapGuide.MaestroAPI.Serialization;
-using OSGeo.MapGuide.MaestroAPI.Native.Mapping;
+using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.ObjectModels.MapDefinition;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
 
 namespace OSGeo.MapGuide.MaestroAPI.Native
 {
     public class LocalNativeConnection : ServerConnectionBase, 
                                          IServerConnection,
                                          IFeatureService,
-                                         IResourceService
+                                         IResourceService,
+                                         ITileService,
+                                         //IMappingService,
+                                         IDrawingService,
+                                         ISiteService
     {
         private OSGeo.MapGuide.MgSiteConnection m_con;
         private string m_locale;
         private string m_sessionId;
         private Version m_siteVersion = null;
 
+        /// <summary>
+        /// The web config file
+        /// </summary>
+        protected string m_webconfig;
+
         public const string PARAM_SESSION = "SessionId";
         public const string PARAM_CONFIG = "ConfigFile";
         public const string PARAM_USERNAME = "Username";
@@ -97,6 +106,7 @@
 
         private void InitConnection(string configFile, string username, string password, string locale)
         {
+            m_webconfig = configFile;
             m_username = username;
             m_password = password;
             m_locale = locale;
@@ -106,7 +116,7 @@
             RestartSession();
         }
 
-        // <summary>
+        /// <summary>
         /// Returns a working copy of the site connection.
         /// </summary>
         private MgSiteConnection Connection
@@ -120,7 +130,7 @@
             }
         }
 
-       public override string SessionID
+        public override string SessionID
 		{
 			get
 			{
@@ -598,7 +608,8 @@
 			else if (parts.Length != 2)
 				throw new Exception("Unable to parse classname into class and schema: " + classname);
 
-            foreach(MgClassDefinition cdef in fes.DescribeSchema(resId, parts[0])[0].GetClasses())
+            foreach (MgClassDefinition cdef in fes.DescribeSchema(resId, parts[0])[0].GetClasses())
+            {
                 if (parts.Length == 1 || cdef.Name.ToLower().Trim().Equals(parts[1].ToLower().Trim()))
                 {
                     props = cdef.GetIdentityProperties();
@@ -609,6 +620,7 @@
 
                     return res;
                 }
+            }
 
             throw new Exception("Unable to find class: " + parts[1] + " in schema " + parts[0]);
 		}
@@ -855,7 +867,7 @@
             {
                 if (_caps == null)
                 {
-                    _caps = new LocalNativeCapabilities();
+                    _caps = new LocalNativeCapabilities(this);
                 }
                 return _caps;
             }
@@ -863,7 +875,22 @@
 
         public OSGeo.MapGuide.MaestroAPI.Services.IService GetService(int serviceType)
         {
-            throw new NotImplementedException();
+            ServiceType st = (ServiceType)serviceType;
+            switch (st)
+            {
+                case ServiceType.Drawing:
+                case ServiceType.Feature:
+                case ServiceType.Mapping:
+                case ServiceType.Resource:
+                case ServiceType.Tile:
+                case ServiceType.Site:
+                    return this;
+                case ServiceType.Fusion:
+                    if (this.SiteVersion >= new Version(2, 0))
+                        return this;
+                    break;
+            }
+            throw new UnsupportedServiceTypeException(st);
         }
 
         protected override IServerConnection GetInterface()
@@ -904,22 +931,204 @@
 
         public override string[] GetCustomPropertyNames()
         {
-            throw new NotImplementedException();
+            return new string[] { };
         }
 
         public override Type GetCustomPropertyType(string name)
         {
-            throw new NotImplementedException();
+            throw new CustomPropertyNotFoundException();
         }
 
         public override void SetCustomProperty(string name, object value)
         {
-            throw new NotImplementedException();
+            throw new CustomPropertyNotFoundException();
         }
 
         public override object GetCustomProperty(string name)
         {
-            throw new NotImplementedException();
+            throw new CustomPropertyNotFoundException();
         }
+
+        public override DataStoreList EnumerateDataStores(string providerName, string partialConnString)
+        {
+            var fes = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
+            return (DataStoreList)base.DeserializeObject(typeof(DataStoreList), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("EnumerateDataStores"), new object[] { providerName, partialConnString }));
+        }
+
+        public override string[] GetSchemas(string resourceId)
+        {
+            List<string> names = new List<string>();
+            var fsvc = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
+            var schemaNames = fsvc.GetSchemas(new MgResourceIdentifier(resourceId));
+            for (int i = 0; i < schemaNames.GetCount(); i++)
+            {
+                names.Add(schemaNames.GetItem(i));
+            }
+            return names.ToArray();
+        }
+
+        public override string[] GetClassNames(string resourceId, string schemaName)
+        {
+            List<string> names = new List<string>();
+            var fsvc = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
+            var classNames = fsvc.GetClasses(new MgResourceIdentifier(resourceId), schemaName);
+            for (int i = 0; i < classNames.GetCount(); i++)
+            {
+                names.Add(classNames.GetItem(i));
+            }
+            return names.ToArray();
+        }
+
+        public override IServerConnection Clone()
+        {
+            var initP = new NameValueCollection();
+            initP[PARAM_SESSION] = this.SessionID;
+            return new LocalNativeConnection(initP);
+        }
+
+        private MgServerAdmin _admin;
+
+        internal MgServerAdmin ServerAdmin
+        {
+            get
+            {
+                if (_admin == null)
+                {
+                    _admin = new MgServerAdmin();
+                    _admin.Open(new MgUserInformation(this.SessionID));
+                }
+
+                return _admin;
+            }
+        }
+
+        public override SiteInformation GetSiteInfo()
+        {
+            var info = new SiteInformation();
+            info.SiteServer = new SiteInformationSiteServer();
+            info.SiteServer.OperatingSystem = new SiteInformationSiteServerOperatingSystem();
+            info.Statistics = new SiteInformationStatistics();
+
+            var props = this.ServerAdmin.GetInformationProperties();
+
+            var prop = props.GetItem(MgServerInformationProperties.DisplayName);
+            info.SiteServer.DisplayName = ((MgStringProperty)prop).GetValue();
+
+            prop = props.GetItem(MgServerInformationProperties.OperatingSystemVersion);
+            info.SiteServer.OperatingSystem.Version = ((MgStringProperty)prop).GetValue();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalPhysicalMemory);
+            info.SiteServer.OperatingSystem.TotalPhysicalMemory = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalVirtualMemory);
+            info.SiteServer.OperatingSystem.TotalVirtualMemory = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.AvailablePhysicalMemory);
+            info.SiteServer.OperatingSystem.AvailablePhysicalMemory = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.AvailableVirtualMemory);
+            info.SiteServer.OperatingSystem.AvailableVirtualMemory = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.Status);
+            info.SiteServer.Status = ((MgBooleanProperty)prop).GetValue() ? "Online" : "Offline";
+
+            prop = props.GetItem(MgServerInformationProperties.ServerVersion);
+            info.SiteServer.Version = ((MgStringProperty)prop).GetValue();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalActiveConnections);
+            info.Statistics.ActiveConnections = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.AdminOperationsQueueCount);
+            info.Statistics.AdminOperationsQueueCount = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.AverageOperationTime);
+            info.Statistics.AverageOperationTime = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.ClientOperationsQueueCount);
+            info.Statistics.ClientOperationsQueueCount = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.CpuUtilization);
+            info.Statistics.CpuUtilization = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.SiteOperationsQueueCount);
+            info.Statistics.SiteOperationsQueueCount = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalConnections);
+            info.Statistics.TotalConnections = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalProcessedOperations);
+            info.Statistics.TotalOperationsProcessed = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalReceivedOperations);
+            info.Statistics.TotalOperationsReceived = ((MgInt32Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.TotalOperationTime);
+            info.Statistics.TotalOperationTime = ((MgInt64Property)prop).GetValue().ToString();
+
+            prop = props.GetItem(MgServerInformationProperties.Uptime);
+            info.Statistics.Uptime = ((MgInt64Property)prop).GetValue().ToString();
+
+            return info;
+        }
+
+        public Stream DescribeDrawing(string resourceID)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("DescribeDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+        }
+
+        public string[] EnumerateDrawingLayers(string resourceID, string sectionName)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            var layers = dwSvc.EnumerateLayers(new MgResourceIdentifier(resourceID), sectionName);
+            var layerNames = new List<string>();
+            for (int i = 0; i < layers.GetCount(); i++)
+            {
+                layerNames.Add(layers.GetItem(i));
+            }
+            return layerNames.ToArray();
+        }
+
+        public DrawingSectionResourceList EnumerateDrawingSectionResources(string resourceID, string sectionName)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return base.DeserializeObject<DrawingSectionResourceList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSectionResources"), new object[] { new MgResourceIdentifier(resourceID), sectionName }));
+        }
+
+        public DrawingSectionList EnumerateDrawingSections(string resourceID)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return base.DeserializeObject<DrawingSectionList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSections"), new object[] { new MgResourceIdentifier(resourceID) }));
+        }
+
+        public string GetDrawingCoordinateSpace(string resourceID)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return dwSvc.GetCoordinateSpace(new MgResourceIdentifier(resourceID));
+        }
+
+        public Stream GetDrawing(string resourceID)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+        }
+
+        public Stream GetLayer(string resourceID, string sectionName, string layerName)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetLayer"), new object[] { new MgResourceIdentifier(resourceID), sectionName, layerName });
+        }
+
+        public Stream GetSection(string resourceID, string sectionName)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSection"), new object[] { new MgResourceIdentifier(resourceID), sectionName });
+        }
+
+        public Stream GetSectionResource(string resourceID, string resourceName)
+        {
+            var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
+            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSectionResource"), new object[] { new MgResourceIdentifier(resourceID), resourceName });
+        }
     }
 }

Copied: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj (from rev 5321, sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native-2.2.0.csproj)
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F4420153-9DF3-4407-AD65-E8ABED2B6E25}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>OSGeo.MapGuide.MaestroAPI.Native</RootNamespace>
+    <AssemblyName>OSGeo.MapGuide.MaestroAPI.Native</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="MapGuideDotNetApi, Version=2.0.0.2308, Culture=neutral, PublicKeyToken=f526c48929fda856, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Thirdparty\MapGuideDotNetApi\MapGuideDotNetApi.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Topology, Version=1.0.8.24721, Culture=neutral, PublicKeyToken=f526c48929fda856, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Thirdparty\TF.NET\Topology.dll</HintPath>
+    </Reference>
+    <Reference Include="Topology.IO.MapGuide, Version=1.0.8.40022, Culture=neutral, PublicKeyToken=f526c48929fda856, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Thirdparty\TF.NET\Topology.IO.MapGuide.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\Properties\GlobalAssemblyInfo.cs">
+      <Link>GlobalAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="LocalNativeCapabilities.cs" />
+    <Compile Include="LocalNativeConnection.cs" />
+    <Compile Include="LocalNativeCoordinateSystem.cs" />
+    <Compile Include="LocalNativeCoordinateSystemCatalog.cs" />
+    <Compile Include="LocalNativeCoordinateSystemCategory.cs" />
+    <Compile Include="LocalNativeFeatureSetReader.cs" />
+    <Compile Include="Utility.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
+      <Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
+      <Name>OSGeo.MapGuide.MaestroAPI</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Commands\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo-2.2.0.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo-2.2.0.cs	2010-10-25 03:03:23 UTC (rev 5322)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo-2.2.0.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -1,55 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("OSGeo.MapGuide.MaestroAPI.Native-2.2.0")]
-[assembly: AssemblyDescription("MaestroAPI implementation wrapper for MapGuide Open Source 2.2")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("OSGeo.MapGuide.MaestroAPI.Native-2.2.0")]
-[assembly: AssemblyCopyright("Copyright ©  2010")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("D80991DF-E4D3-43ee-AF2B-C96AD8462C70")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]

Copied: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs (from rev 5321, sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo-2.2.0.cs)
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs	2010-10-25 06:57:06 UTC (rev 5323)
@@ -0,0 +1,46 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using OSGeo.MapGuide.MaestroAPI.Native;
+using OSGeo.MapGuide.MaestroAPI;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OSGeo.MapGuide.MaestroAPI.Native")]
+[assembly: AssemblyDescription("MaestroAPI implementation wrapper for Official MapGuide API")]
+[assembly: AssemblyProduct("OSGeo.MapGuide.MaestroAPI.Native")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("D80991DF-E4D3-43ee-AF2B-C96AD8462C70")]
+
+[assembly: InternalsVisibleTo("MaestroAPITests")]
+[assembly: InternalsVisibleTo("MaestroBaseTests")]
+
+[assembly: MaestroApiProvider("Maestro.LocalNative", "Maestro wrapper for official MapGuide API", typeof(LocalNativeConnection), true)]
\ No newline at end of file



More information about the mapguide-commits mailing list