Index: CCTrayExtensions/CCTrayExtensions.csproj
===================================================================
--- CCTrayExtensions/CCTrayExtensions.csproj (revision 0)
+++ CCTrayExtensions/CCTrayExtensions.csproj (revision 0)
@@ -0,0 +1,94 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.21022
+ 2.0
+ {A92A4CC1-836E-4BE2-8601-FF6B2497389B}
+ Library
+ Properties
+ ThoughtWorks.CruiseControl.CCTrayExtensions
+ CCTrayExtensions
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+ 3.5
+
+
+
+ 3.0
+
+
+ 3.0
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+ Form
+
+
+ WcfConfigurationWindow.cs
+
+
+
+
+
+
+
+
+
+ {C8043AD9-0F30-4366-A263-E2FC0D6A57A9}
+ CCTrayLib
+
+
+ {E820CF3B-8C5A-4002-BC16-B7818D3D54A8}
+ Remote
+
+
+
+
+ WcfConfigurationWindow.cs
+ Designer
+
+
+
+
+
\ No newline at end of file
Index: CCTrayExtensions/Properties/AssemblyInfo.cs
===================================================================
--- CCTrayExtensions/Properties/AssemblyInfo.cs (revision 0)
+++ CCTrayExtensions/Properties/AssemblyInfo.cs (revision 0)
@@ -0,0 +1,36 @@
+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("CCTrayExtensions")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("CCTrayExtensions")]
+[assembly: AssemblyCopyright("Copyright © 2008")]
+[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("17d3b77d-8e13-4500-89b2-7a08ea00ab27")]
+
+// 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")]
Index: CCTrayExtensions/TransportBinding.cs
===================================================================
--- CCTrayExtensions/TransportBinding.cs (revision 0)
+++ CCTrayExtensions/TransportBinding.cs (revision 0)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ public enum TransportBinding
+ {
+ BasicHttp,
+ WSHttp,
+ NetTcp,
+ NamedPipes,
+ }
+}
Index: CCTrayExtensions/WcfClient.cs
===================================================================
--- CCTrayExtensions/WcfClient.cs (revision 0)
+++ CCTrayExtensions/WcfClient.cs (revision 0)
@@ -0,0 +1,1364 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.1434
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ThoughtWorks.CruiseControl.WcfClient
+{
+ using System.Runtime.Serialization;
+
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Snapshot", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")]
+ internal partial class Snapshot : object, System.Runtime.Serialization.IExtensibleDataObject
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private ThoughtWorks.CruiseControl.WcfClient.Project[] ProjectsField;
+
+ private ThoughtWorks.CruiseControl.WcfClient.Queue[] QueuesField;
+
+ private string ServerVersionField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal ThoughtWorks.CruiseControl.WcfClient.Project[] Projects
+ {
+ get
+ {
+ return this.ProjectsField;
+ }
+ set
+ {
+ this.ProjectsField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal ThoughtWorks.CruiseControl.WcfClient.Queue[] Queues
+ {
+ get
+ {
+ return this.QueuesField;
+ }
+ set
+ {
+ this.QueuesField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string ServerVersion
+ {
+ get
+ {
+ return this.ServerVersionField;
+ }
+ set
+ {
+ this.ServerVersionField = value;
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Project", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")]
+ internal partial class Project : object, System.Runtime.Serialization.IExtensibleDataObject
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private string ActivityField;
+
+ private string BuildStageField;
+
+ private string BuildStatusField;
+
+ private string CategoryField;
+
+ private string LastBuildLabelField;
+
+ private System.DateTime LastBuildTimeField;
+
+ private string LastSuccessfulBuildLabelField;
+
+ private string NameField;
+
+ private System.DateTime NextBuildTimeField;
+
+ private string ProjectStatusField;
+
+ private string WebUrlField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Activity
+ {
+ get
+ {
+ return this.ActivityField;
+ }
+ set
+ {
+ this.ActivityField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string BuildStage
+ {
+ get
+ {
+ return this.BuildStageField;
+ }
+ set
+ {
+ this.BuildStageField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string BuildStatus
+ {
+ get
+ {
+ return this.BuildStatusField;
+ }
+ set
+ {
+ this.BuildStatusField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Category
+ {
+ get
+ {
+ return this.CategoryField;
+ }
+ set
+ {
+ this.CategoryField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string LastBuildLabel
+ {
+ get
+ {
+ return this.LastBuildLabelField;
+ }
+ set
+ {
+ this.LastBuildLabelField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal System.DateTime LastBuildTime
+ {
+ get
+ {
+ return this.LastBuildTimeField;
+ }
+ set
+ {
+ this.LastBuildTimeField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string LastSuccessfulBuildLabel
+ {
+ get
+ {
+ return this.LastSuccessfulBuildLabelField;
+ }
+ set
+ {
+ this.LastSuccessfulBuildLabelField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Name
+ {
+ get
+ {
+ return this.NameField;
+ }
+ set
+ {
+ this.NameField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal System.DateTime NextBuildTime
+ {
+ get
+ {
+ return this.NextBuildTimeField;
+ }
+ set
+ {
+ this.NextBuildTimeField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string ProjectStatus
+ {
+ get
+ {
+ return this.ProjectStatusField;
+ }
+ set
+ {
+ this.ProjectStatusField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string WebUrl
+ {
+ get
+ {
+ return this.WebUrlField;
+ }
+ set
+ {
+ this.WebUrlField = value;
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Queue", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")]
+ internal partial class Queue : object, System.Runtime.Serialization.IExtensibleDataObject
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private string NameField;
+
+ private ThoughtWorks.CruiseControl.WcfClient.QueueRequest[] RequestsField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Name
+ {
+ get
+ {
+ return this.NameField;
+ }
+ set
+ {
+ this.NameField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal ThoughtWorks.CruiseControl.WcfClient.QueueRequest[] Requests
+ {
+ get
+ {
+ return this.RequestsField;
+ }
+ set
+ {
+ this.RequestsField = value;
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="QueueRequest", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")]
+ internal partial class QueueRequest : object, System.Runtime.Serialization.IExtensibleDataObject
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private string ActivityField;
+
+ private string ProjectNameField;
+
+ private System.DateTime RequestTimeField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Activity
+ {
+ get
+ {
+ return this.ActivityField;
+ }
+ set
+ {
+ this.ActivityField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string ProjectName
+ {
+ get
+ {
+ return this.ProjectNameField;
+ }
+ set
+ {
+ this.ProjectNameField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal System.DateTime RequestTime
+ {
+ get
+ {
+ return this.RequestTimeField;
+ }
+ set
+ {
+ this.RequestTimeField = value;
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="ServerFault", Namespace="http://ccnet.thoughtworks.com/1/5/wcf")]
+ internal partial class ServerFault : object, System.Runtime.Serialization.IExtensibleDataObject
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private string OperationField;
+
+ private string ReasonField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Operation
+ {
+ get
+ {
+ return this.OperationField;
+ }
+ set
+ {
+ this.OperationField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ internal string Reason
+ {
+ get
+ {
+ return this.ReasonField;
+ }
+ set
+ {
+ this.ReasonField = value;
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ [System.ServiceModel.ServiceContractAttribute(Namespace="http://ccnet.thoughtworks.com/1/5/wcf", ConfigurationName="ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract")]
+ internal interface ICruiseControlContract
+ {
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersion", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersionRespo" +
+ "nse")]
+ string RetrieveVersion();
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersion", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveVersionRespo" +
+ "nse")]
+ System.IAsyncResult BeginRetrieveVersion(System.AsyncCallback callback, object asyncState);
+
+ string EndRetrieveVersion(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshot", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshotResp" +
+ "onse")]
+ ThoughtWorks.CruiseControl.WcfClient.Snapshot RetrieveSnapshot();
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshot", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveSnapshotResp" +
+ "onse")]
+ System.IAsyncResult BeginRetrieveSnapshot(System.AsyncCallback callback, object asyncState);
+
+ ThoughtWorks.CruiseControl.WcfClient.Snapshot EndRetrieveSnapshot(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjects", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectsResp" +
+ "onse")]
+ ThoughtWorks.CruiseControl.WcfClient.Project[] RetrieveProjects();
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjects", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectsResp" +
+ "onse")]
+ System.IAsyncResult BeginRetrieveProjects(System.AsyncCallback callback, object asyncState);
+
+ ThoughtWorks.CruiseControl.WcfClient.Project[] EndRetrieveProjects(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectRespo" +
+ "nse")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectServe" +
+ "rFaultFault", Name="ServerFault")]
+ ThoughtWorks.CruiseControl.WcfClient.Project RetrieveProject(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/RetrieveProjectRespo" +
+ "nse")]
+ System.IAsyncResult BeginRetrieveProject(string projectName, System.AsyncCallback callback, object asyncState);
+
+ ThoughtWorks.CruiseControl.WcfClient.Project EndRetrieveProject(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildResponse")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildServerFaul" +
+ "tFault", Name="ServerFault")]
+ void ForceBuild(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/ForceBuildResponse")]
+ System.IAsyncResult BeginForceBuild(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndForceBuild(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectResponse" +
+ "")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectServerFa" +
+ "ultFault", Name="ServerFault")]
+ void StartProject(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StartProjectResponse" +
+ "")]
+ System.IAsyncResult BeginStartProject(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndStartProject(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectResponse")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectServerFau" +
+ "ltFault", Name="ServerFault")]
+ void StopProject(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProject", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/StopProjectResponse")]
+ System.IAsyncResult BeginStopProject(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndStopProject(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildResponse")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildServerFaul" +
+ "tFault", Name="ServerFault")]
+ void AbortBuild(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/AbortBuildResponse")]
+ System.IAsyncResult BeginAbortBuild(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndAbortBuild(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" +
+ "", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" +
+ "Response")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" +
+ "ServerFaultFault", Name="ServerFault")]
+ void CancelPendingRequest(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" +
+ "", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/CancelPendingRequest" +
+ "Response")]
+ System.IAsyncResult BeginCancelPendingRequest(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndCancelPendingRequest(System.IAsyncResult result);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildResponse")]
+ [System.ServiceModel.FaultContractAttribute(typeof(ThoughtWorks.CruiseControl.WcfClient.ServerFault), Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildServerFaultF" +
+ "ault", Name="ServerFault")]
+ void FixBuild(string projectName);
+
+ [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuild", ReplyAction="http://ccnet.thoughtworks.com/1/5/wcf/ICruiseControlContract/FixBuildResponse")]
+ System.IAsyncResult BeginFixBuild(string projectName, System.AsyncCallback callback, object asyncState);
+
+ void EndFixBuild(System.IAsyncResult result);
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal interface ICruiseControlContractChannel : ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract, System.ServiceModel.IClientChannel
+ {
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal partial class RetrieveVersionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
+ {
+
+ private object[] results;
+
+ public RetrieveVersionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState)
+ {
+ this.results = results;
+ }
+
+ public string Result
+ {
+ get
+ {
+ base.RaiseExceptionIfNecessary();
+ return ((string)(this.results[0]));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal partial class RetrieveSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
+ {
+
+ private object[] results;
+
+ public RetrieveSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState)
+ {
+ this.results = results;
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Snapshot Result
+ {
+ get
+ {
+ base.RaiseExceptionIfNecessary();
+ return ((ThoughtWorks.CruiseControl.WcfClient.Snapshot)(this.results[0]));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal partial class RetrieveProjectsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
+ {
+
+ private object[] results;
+
+ public RetrieveProjectsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState)
+ {
+ this.results = results;
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Project[] Result
+ {
+ get
+ {
+ base.RaiseExceptionIfNecessary();
+ return ((ThoughtWorks.CruiseControl.WcfClient.Project[])(this.results[0]));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal partial class RetrieveProjectCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
+ {
+
+ private object[] results;
+
+ public RetrieveProjectCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState)
+ {
+ this.results = results;
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Project Result
+ {
+ get
+ {
+ base.RaiseExceptionIfNecessary();
+ return ((ThoughtWorks.CruiseControl.WcfClient.Project)(this.results[0]));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
+ internal partial class CruiseControlContractClient : System.ServiceModel.ClientBase, ThoughtWorks.CruiseControl.WcfClient.ICruiseControlContract
+ {
+
+ private BeginOperationDelegate onBeginRetrieveVersionDelegate;
+
+ private EndOperationDelegate onEndRetrieveVersionDelegate;
+
+ private System.Threading.SendOrPostCallback onRetrieveVersionCompletedDelegate;
+
+ private BeginOperationDelegate onBeginRetrieveSnapshotDelegate;
+
+ private EndOperationDelegate onEndRetrieveSnapshotDelegate;
+
+ private System.Threading.SendOrPostCallback onRetrieveSnapshotCompletedDelegate;
+
+ private BeginOperationDelegate onBeginRetrieveProjectsDelegate;
+
+ private EndOperationDelegate onEndRetrieveProjectsDelegate;
+
+ private System.Threading.SendOrPostCallback onRetrieveProjectsCompletedDelegate;
+
+ private BeginOperationDelegate onBeginRetrieveProjectDelegate;
+
+ private EndOperationDelegate onEndRetrieveProjectDelegate;
+
+ private System.Threading.SendOrPostCallback onRetrieveProjectCompletedDelegate;
+
+ private BeginOperationDelegate onBeginForceBuildDelegate;
+
+ private EndOperationDelegate onEndForceBuildDelegate;
+
+ private System.Threading.SendOrPostCallback onForceBuildCompletedDelegate;
+
+ private BeginOperationDelegate onBeginStartProjectDelegate;
+
+ private EndOperationDelegate onEndStartProjectDelegate;
+
+ private System.Threading.SendOrPostCallback onStartProjectCompletedDelegate;
+
+ private BeginOperationDelegate onBeginStopProjectDelegate;
+
+ private EndOperationDelegate onEndStopProjectDelegate;
+
+ private System.Threading.SendOrPostCallback onStopProjectCompletedDelegate;
+
+ private BeginOperationDelegate onBeginAbortBuildDelegate;
+
+ private EndOperationDelegate onEndAbortBuildDelegate;
+
+ private System.Threading.SendOrPostCallback onAbortBuildCompletedDelegate;
+
+ private BeginOperationDelegate onBeginCancelPendingRequestDelegate;
+
+ private EndOperationDelegate onEndCancelPendingRequestDelegate;
+
+ private System.Threading.SendOrPostCallback onCancelPendingRequestCompletedDelegate;
+
+ private BeginOperationDelegate onBeginFixBuildDelegate;
+
+ private EndOperationDelegate onEndFixBuildDelegate;
+
+ private System.Threading.SendOrPostCallback onFixBuildCompletedDelegate;
+
+ public CruiseControlContractClient()
+ {
+ }
+
+ public CruiseControlContractClient(string endpointConfigurationName) :
+ base(endpointConfigurationName)
+ {
+ }
+
+ public CruiseControlContractClient(string endpointConfigurationName, string remoteAddress) :
+ base(endpointConfigurationName, remoteAddress)
+ {
+ }
+
+ public CruiseControlContractClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
+ base(endpointConfigurationName, remoteAddress)
+ {
+ }
+
+ public CruiseControlContractClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
+ base(binding, remoteAddress)
+ {
+ }
+
+ public event System.EventHandler RetrieveVersionCompleted;
+
+ public event System.EventHandler RetrieveSnapshotCompleted;
+
+ public event System.EventHandler RetrieveProjectsCompleted;
+
+ public event System.EventHandler RetrieveProjectCompleted;
+
+ public event System.EventHandler ForceBuildCompleted;
+
+ public event System.EventHandler StartProjectCompleted;
+
+ public event System.EventHandler StopProjectCompleted;
+
+ public event System.EventHandler AbortBuildCompleted;
+
+ public event System.EventHandler CancelPendingRequestCompleted;
+
+ public event System.EventHandler FixBuildCompleted;
+
+ public string RetrieveVersion()
+ {
+ return base.Channel.RetrieveVersion();
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginRetrieveVersion(System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginRetrieveVersion(callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public string EndRetrieveVersion(System.IAsyncResult result)
+ {
+ return base.Channel.EndRetrieveVersion(result);
+ }
+
+ private System.IAsyncResult OnBeginRetrieveVersion(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ return this.BeginRetrieveVersion(callback, asyncState);
+ }
+
+ private object[] OnEndRetrieveVersion(System.IAsyncResult result)
+ {
+ string retVal = this.EndRetrieveVersion(result);
+ return new object[] {
+ retVal};
+ }
+
+ private void OnRetrieveVersionCompleted(object state)
+ {
+ if ((this.RetrieveVersionCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.RetrieveVersionCompleted(this, new RetrieveVersionCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void RetrieveVersionAsync()
+ {
+ this.RetrieveVersionAsync(null);
+ }
+
+ public void RetrieveVersionAsync(object userState)
+ {
+ if ((this.onBeginRetrieveVersionDelegate == null))
+ {
+ this.onBeginRetrieveVersionDelegate = new BeginOperationDelegate(this.OnBeginRetrieveVersion);
+ }
+ if ((this.onEndRetrieveVersionDelegate == null))
+ {
+ this.onEndRetrieveVersionDelegate = new EndOperationDelegate(this.OnEndRetrieveVersion);
+ }
+ if ((this.onRetrieveVersionCompletedDelegate == null))
+ {
+ this.onRetrieveVersionCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveVersionCompleted);
+ }
+ base.InvokeAsync(this.onBeginRetrieveVersionDelegate, null, this.onEndRetrieveVersionDelegate, this.onRetrieveVersionCompletedDelegate, userState);
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Snapshot RetrieveSnapshot()
+ {
+ return base.Channel.RetrieveSnapshot();
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginRetrieveSnapshot(System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginRetrieveSnapshot(callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public ThoughtWorks.CruiseControl.WcfClient.Snapshot EndRetrieveSnapshot(System.IAsyncResult result)
+ {
+ return base.Channel.EndRetrieveSnapshot(result);
+ }
+
+ private System.IAsyncResult OnBeginRetrieveSnapshot(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ return this.BeginRetrieveSnapshot(callback, asyncState);
+ }
+
+ private object[] OnEndRetrieveSnapshot(System.IAsyncResult result)
+ {
+ ThoughtWorks.CruiseControl.WcfClient.Snapshot retVal = this.EndRetrieveSnapshot(result);
+ return new object[] {
+ retVal};
+ }
+
+ private void OnRetrieveSnapshotCompleted(object state)
+ {
+ if ((this.RetrieveSnapshotCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.RetrieveSnapshotCompleted(this, new RetrieveSnapshotCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void RetrieveSnapshotAsync()
+ {
+ this.RetrieveSnapshotAsync(null);
+ }
+
+ public void RetrieveSnapshotAsync(object userState)
+ {
+ if ((this.onBeginRetrieveSnapshotDelegate == null))
+ {
+ this.onBeginRetrieveSnapshotDelegate = new BeginOperationDelegate(this.OnBeginRetrieveSnapshot);
+ }
+ if ((this.onEndRetrieveSnapshotDelegate == null))
+ {
+ this.onEndRetrieveSnapshotDelegate = new EndOperationDelegate(this.OnEndRetrieveSnapshot);
+ }
+ if ((this.onRetrieveSnapshotCompletedDelegate == null))
+ {
+ this.onRetrieveSnapshotCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveSnapshotCompleted);
+ }
+ base.InvokeAsync(this.onBeginRetrieveSnapshotDelegate, null, this.onEndRetrieveSnapshotDelegate, this.onRetrieveSnapshotCompletedDelegate, userState);
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Project[] RetrieveProjects()
+ {
+ return base.Channel.RetrieveProjects();
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginRetrieveProjects(System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginRetrieveProjects(callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public ThoughtWorks.CruiseControl.WcfClient.Project[] EndRetrieveProjects(System.IAsyncResult result)
+ {
+ return base.Channel.EndRetrieveProjects(result);
+ }
+
+ private System.IAsyncResult OnBeginRetrieveProjects(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ return this.BeginRetrieveProjects(callback, asyncState);
+ }
+
+ private object[] OnEndRetrieveProjects(System.IAsyncResult result)
+ {
+ ThoughtWorks.CruiseControl.WcfClient.Project[] retVal = this.EndRetrieveProjects(result);
+ return new object[] {
+ retVal};
+ }
+
+ private void OnRetrieveProjectsCompleted(object state)
+ {
+ if ((this.RetrieveProjectsCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.RetrieveProjectsCompleted(this, new RetrieveProjectsCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void RetrieveProjectsAsync()
+ {
+ this.RetrieveProjectsAsync(null);
+ }
+
+ public void RetrieveProjectsAsync(object userState)
+ {
+ if ((this.onBeginRetrieveProjectsDelegate == null))
+ {
+ this.onBeginRetrieveProjectsDelegate = new BeginOperationDelegate(this.OnBeginRetrieveProjects);
+ }
+ if ((this.onEndRetrieveProjectsDelegate == null))
+ {
+ this.onEndRetrieveProjectsDelegate = new EndOperationDelegate(this.OnEndRetrieveProjects);
+ }
+ if ((this.onRetrieveProjectsCompletedDelegate == null))
+ {
+ this.onRetrieveProjectsCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveProjectsCompleted);
+ }
+ base.InvokeAsync(this.onBeginRetrieveProjectsDelegate, null, this.onEndRetrieveProjectsDelegate, this.onRetrieveProjectsCompletedDelegate, userState);
+ }
+
+ public ThoughtWorks.CruiseControl.WcfClient.Project RetrieveProject(string projectName)
+ {
+ return base.Channel.RetrieveProject(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginRetrieveProject(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginRetrieveProject(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public ThoughtWorks.CruiseControl.WcfClient.Project EndRetrieveProject(System.IAsyncResult result)
+ {
+ return base.Channel.EndRetrieveProject(result);
+ }
+
+ private System.IAsyncResult OnBeginRetrieveProject(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginRetrieveProject(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndRetrieveProject(System.IAsyncResult result)
+ {
+ ThoughtWorks.CruiseControl.WcfClient.Project retVal = this.EndRetrieveProject(result);
+ return new object[] {
+ retVal};
+ }
+
+ private void OnRetrieveProjectCompleted(object state)
+ {
+ if ((this.RetrieveProjectCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.RetrieveProjectCompleted(this, new RetrieveProjectCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void RetrieveProjectAsync(string projectName)
+ {
+ this.RetrieveProjectAsync(projectName, null);
+ }
+
+ public void RetrieveProjectAsync(string projectName, object userState)
+ {
+ if ((this.onBeginRetrieveProjectDelegate == null))
+ {
+ this.onBeginRetrieveProjectDelegate = new BeginOperationDelegate(this.OnBeginRetrieveProject);
+ }
+ if ((this.onEndRetrieveProjectDelegate == null))
+ {
+ this.onEndRetrieveProjectDelegate = new EndOperationDelegate(this.OnEndRetrieveProject);
+ }
+ if ((this.onRetrieveProjectCompletedDelegate == null))
+ {
+ this.onRetrieveProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnRetrieveProjectCompleted);
+ }
+ base.InvokeAsync(this.onBeginRetrieveProjectDelegate, new object[] {
+ projectName}, this.onEndRetrieveProjectDelegate, this.onRetrieveProjectCompletedDelegate, userState);
+ }
+
+ public void ForceBuild(string projectName)
+ {
+ base.Channel.ForceBuild(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginForceBuild(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginForceBuild(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndForceBuild(System.IAsyncResult result)
+ {
+ base.Channel.EndForceBuild(result);
+ }
+
+ private System.IAsyncResult OnBeginForceBuild(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginForceBuild(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndForceBuild(System.IAsyncResult result)
+ {
+ this.EndForceBuild(result);
+ return null;
+ }
+
+ private void OnForceBuildCompleted(object state)
+ {
+ if ((this.ForceBuildCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.ForceBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void ForceBuildAsync(string projectName)
+ {
+ this.ForceBuildAsync(projectName, null);
+ }
+
+ public void ForceBuildAsync(string projectName, object userState)
+ {
+ if ((this.onBeginForceBuildDelegate == null))
+ {
+ this.onBeginForceBuildDelegate = new BeginOperationDelegate(this.OnBeginForceBuild);
+ }
+ if ((this.onEndForceBuildDelegate == null))
+ {
+ this.onEndForceBuildDelegate = new EndOperationDelegate(this.OnEndForceBuild);
+ }
+ if ((this.onForceBuildCompletedDelegate == null))
+ {
+ this.onForceBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnForceBuildCompleted);
+ }
+ base.InvokeAsync(this.onBeginForceBuildDelegate, new object[] {
+ projectName}, this.onEndForceBuildDelegate, this.onForceBuildCompletedDelegate, userState);
+ }
+
+ public void StartProject(string projectName)
+ {
+ base.Channel.StartProject(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginStartProject(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginStartProject(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndStartProject(System.IAsyncResult result)
+ {
+ base.Channel.EndStartProject(result);
+ }
+
+ private System.IAsyncResult OnBeginStartProject(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginStartProject(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndStartProject(System.IAsyncResult result)
+ {
+ this.EndStartProject(result);
+ return null;
+ }
+
+ private void OnStartProjectCompleted(object state)
+ {
+ if ((this.StartProjectCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.StartProjectCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void StartProjectAsync(string projectName)
+ {
+ this.StartProjectAsync(projectName, null);
+ }
+
+ public void StartProjectAsync(string projectName, object userState)
+ {
+ if ((this.onBeginStartProjectDelegate == null))
+ {
+ this.onBeginStartProjectDelegate = new BeginOperationDelegate(this.OnBeginStartProject);
+ }
+ if ((this.onEndStartProjectDelegate == null))
+ {
+ this.onEndStartProjectDelegate = new EndOperationDelegate(this.OnEndStartProject);
+ }
+ if ((this.onStartProjectCompletedDelegate == null))
+ {
+ this.onStartProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStartProjectCompleted);
+ }
+ base.InvokeAsync(this.onBeginStartProjectDelegate, new object[] {
+ projectName}, this.onEndStartProjectDelegate, this.onStartProjectCompletedDelegate, userState);
+ }
+
+ public void StopProject(string projectName)
+ {
+ base.Channel.StopProject(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginStopProject(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginStopProject(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndStopProject(System.IAsyncResult result)
+ {
+ base.Channel.EndStopProject(result);
+ }
+
+ private System.IAsyncResult OnBeginStopProject(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginStopProject(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndStopProject(System.IAsyncResult result)
+ {
+ this.EndStopProject(result);
+ return null;
+ }
+
+ private void OnStopProjectCompleted(object state)
+ {
+ if ((this.StopProjectCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.StopProjectCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void StopProjectAsync(string projectName)
+ {
+ this.StopProjectAsync(projectName, null);
+ }
+
+ public void StopProjectAsync(string projectName, object userState)
+ {
+ if ((this.onBeginStopProjectDelegate == null))
+ {
+ this.onBeginStopProjectDelegate = new BeginOperationDelegate(this.OnBeginStopProject);
+ }
+ if ((this.onEndStopProjectDelegate == null))
+ {
+ this.onEndStopProjectDelegate = new EndOperationDelegate(this.OnEndStopProject);
+ }
+ if ((this.onStopProjectCompletedDelegate == null))
+ {
+ this.onStopProjectCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStopProjectCompleted);
+ }
+ base.InvokeAsync(this.onBeginStopProjectDelegate, new object[] {
+ projectName}, this.onEndStopProjectDelegate, this.onStopProjectCompletedDelegate, userState);
+ }
+
+ public void AbortBuild(string projectName)
+ {
+ base.Channel.AbortBuild(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginAbortBuild(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginAbortBuild(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndAbortBuild(System.IAsyncResult result)
+ {
+ base.Channel.EndAbortBuild(result);
+ }
+
+ private System.IAsyncResult OnBeginAbortBuild(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginAbortBuild(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndAbortBuild(System.IAsyncResult result)
+ {
+ this.EndAbortBuild(result);
+ return null;
+ }
+
+ private void OnAbortBuildCompleted(object state)
+ {
+ if ((this.AbortBuildCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.AbortBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void AbortBuildAsync(string projectName)
+ {
+ this.AbortBuildAsync(projectName, null);
+ }
+
+ public void AbortBuildAsync(string projectName, object userState)
+ {
+ if ((this.onBeginAbortBuildDelegate == null))
+ {
+ this.onBeginAbortBuildDelegate = new BeginOperationDelegate(this.OnBeginAbortBuild);
+ }
+ if ((this.onEndAbortBuildDelegate == null))
+ {
+ this.onEndAbortBuildDelegate = new EndOperationDelegate(this.OnEndAbortBuild);
+ }
+ if ((this.onAbortBuildCompletedDelegate == null))
+ {
+ this.onAbortBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnAbortBuildCompleted);
+ }
+ base.InvokeAsync(this.onBeginAbortBuildDelegate, new object[] {
+ projectName}, this.onEndAbortBuildDelegate, this.onAbortBuildCompletedDelegate, userState);
+ }
+
+ public void CancelPendingRequest(string projectName)
+ {
+ base.Channel.CancelPendingRequest(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginCancelPendingRequest(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginCancelPendingRequest(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndCancelPendingRequest(System.IAsyncResult result)
+ {
+ base.Channel.EndCancelPendingRequest(result);
+ }
+
+ private System.IAsyncResult OnBeginCancelPendingRequest(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginCancelPendingRequest(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndCancelPendingRequest(System.IAsyncResult result)
+ {
+ this.EndCancelPendingRequest(result);
+ return null;
+ }
+
+ private void OnCancelPendingRequestCompleted(object state)
+ {
+ if ((this.CancelPendingRequestCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.CancelPendingRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void CancelPendingRequestAsync(string projectName)
+ {
+ this.CancelPendingRequestAsync(projectName, null);
+ }
+
+ public void CancelPendingRequestAsync(string projectName, object userState)
+ {
+ if ((this.onBeginCancelPendingRequestDelegate == null))
+ {
+ this.onBeginCancelPendingRequestDelegate = new BeginOperationDelegate(this.OnBeginCancelPendingRequest);
+ }
+ if ((this.onEndCancelPendingRequestDelegate == null))
+ {
+ this.onEndCancelPendingRequestDelegate = new EndOperationDelegate(this.OnEndCancelPendingRequest);
+ }
+ if ((this.onCancelPendingRequestCompletedDelegate == null))
+ {
+ this.onCancelPendingRequestCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnCancelPendingRequestCompleted);
+ }
+ base.InvokeAsync(this.onBeginCancelPendingRequestDelegate, new object[] {
+ projectName}, this.onEndCancelPendingRequestDelegate, this.onCancelPendingRequestCompletedDelegate, userState);
+ }
+
+ public void FixBuild(string projectName)
+ {
+ base.Channel.FixBuild(projectName);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public System.IAsyncResult BeginFixBuild(string projectName, System.AsyncCallback callback, object asyncState)
+ {
+ return base.Channel.BeginFixBuild(projectName, callback, asyncState);
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+ public void EndFixBuild(System.IAsyncResult result)
+ {
+ base.Channel.EndFixBuild(result);
+ }
+
+ private System.IAsyncResult OnBeginFixBuild(object[] inValues, System.AsyncCallback callback, object asyncState)
+ {
+ string projectName = ((string)(inValues[0]));
+ return this.BeginFixBuild(projectName, callback, asyncState);
+ }
+
+ private object[] OnEndFixBuild(System.IAsyncResult result)
+ {
+ this.EndFixBuild(result);
+ return null;
+ }
+
+ private void OnFixBuildCompleted(object state)
+ {
+ if ((this.FixBuildCompleted != null))
+ {
+ InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+ this.FixBuildCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(e.Error, e.Cancelled, e.UserState));
+ }
+ }
+
+ public void FixBuildAsync(string projectName)
+ {
+ this.FixBuildAsync(projectName, null);
+ }
+
+ public void FixBuildAsync(string projectName, object userState)
+ {
+ if ((this.onBeginFixBuildDelegate == null))
+ {
+ this.onBeginFixBuildDelegate = new BeginOperationDelegate(this.OnBeginFixBuild);
+ }
+ if ((this.onEndFixBuildDelegate == null))
+ {
+ this.onEndFixBuildDelegate = new EndOperationDelegate(this.OnEndFixBuild);
+ }
+ if ((this.onFixBuildCompletedDelegate == null))
+ {
+ this.onFixBuildCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnFixBuildCompleted);
+ }
+ base.InvokeAsync(this.onBeginFixBuildDelegate, new object[] {
+ projectName}, this.onEndFixBuildDelegate, this.onFixBuildCompletedDelegate, userState);
+ }
+ }
+}
Index: CCTrayExtensions/WcfConfigurationWindow.cs
===================================================================
--- CCTrayExtensions/WcfConfigurationWindow.cs (revision 0)
+++ CCTrayExtensions/WcfConfigurationWindow.cs (revision 0)
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ public partial class WcfConfigurationWindow : Form
+ {
+ private WcfExtension _extension;
+
+ public WcfConfigurationWindow(WcfExtension extension)
+ {
+ InitializeComponent();
+ this._extension = extension;
+
+ cmbBinding.Items.AddRange((from binding in Enum.GetNames(typeof(TransportBinding))
+ orderby binding
+ select binding).ToArray());
+ cmbBinding.SelectedItem = _extension.Binding.ToString();
+ txtEndpoint.Text = _extension.Url;
+ }
+
+ private void btnOk_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.OK;
+ _extension.Url = txtEndpoint.Text;
+ _extension.Binding = (TransportBinding)Enum.Parse(typeof(TransportBinding), cmbBinding.SelectedItem.ToString());
+ this.Close();
+ }
+ }
+}
Index: CCTrayExtensions/WcfConfigurationWindow.Designer.cs
===================================================================
--- CCTrayExtensions/WcfConfigurationWindow.Designer.cs (revision 0)
+++ CCTrayExtensions/WcfConfigurationWindow.Designer.cs (revision 0)
@@ -0,0 +1,127 @@
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ partial class WcfConfigurationWindow
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WcfConfigurationWindow));
+ this.label1 = new System.Windows.Forms.Label();
+ this.cmbBinding = new System.Windows.Forms.ComboBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.txtEndpoint = new System.Windows.Forms.TextBox();
+ this.btnOk = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(45, 13);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "&Binding:";
+ //
+ // cmbBinding
+ //
+ this.cmbBinding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cmbBinding.FormattingEnabled = true;
+ this.cmbBinding.Location = new System.Drawing.Point(70, 15);
+ this.cmbBinding.Name = "cmbBinding";
+ this.cmbBinding.Size = new System.Drawing.Size(251, 21);
+ this.cmbBinding.TabIndex = 1;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 42);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(52, 13);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "&Endpoint:";
+ //
+ // txtEndpoint
+ //
+ this.txtEndpoint.Location = new System.Drawing.Point(70, 39);
+ this.txtEndpoint.Name = "txtEndpoint";
+ this.txtEndpoint.Size = new System.Drawing.Size(230, 20);
+ this.txtEndpoint.TabIndex = 3;
+ //
+ // btnOk
+ //
+ this.btnOk.Location = new System.Drawing.Point(246, 65);
+ this.btnOk.Name = "btnOk";
+ this.btnOk.Size = new System.Drawing.Size(75, 23);
+ this.btnOk.TabIndex = 4;
+ this.btnOk.Text = "&Ok";
+ this.btnOk.UseVisualStyleBackColor = true;
+ this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(165, 65);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ //
+ // WcfConfigurationWindow
+ //
+ this.AcceptButton = this.btnOk;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(333, 99);
+ this.ControlBox = false;
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnOk);
+ this.Controls.Add(this.txtEndpoint);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.cmbBinding);
+ this.Controls.Add(this.label1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "WcfConfigurationWindow";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "WCF Extension Configuration";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ComboBox cmbBinding;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox txtEndpoint;
+ private System.Windows.Forms.Button btnOk;
+ private System.Windows.Forms.Button btnCancel;
+ }
+}
\ No newline at end of file
Index: CCTrayExtensions/WcfConfigurationWindow.resx
===================================================================
--- CCTrayExtensions/WcfConfigurationWindow.resx (revision 0)
+++ CCTrayExtensions/WcfConfigurationWindow.resx (revision 0)
@@ -0,0 +1,500 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA
+ IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAKwAADC0MAAAzAAAAOwAACTUJAAg5CAAQLhAAETURABI5
+ EgAYMhgAGDgYACAuIAAgMiAAJDskACg3KAAoOigAMzwzADk9OQAAQwAAAEwAAA5EDgAAUwAAAFsAAAlV
+ CQALWgsAE0YTABJXEgAAYwAAAGsAAApmCgAMaQwAAHMAAAB7AAAMcgwADHsMABJiEgATaRMAGWQZABtr
+ GwAVdhUAOkk6ADVSNQAiZiIAImoiAChnKAAuaC4AI3cjACN9IwAtdC0AK3krADtvOwA4djgAQEBAAExN
+ TABIWkgAUlJSAFxcXABNZE0ASHdIAF1iXQBafloAaWlpAHJycgB8fHwAAIMAAACLAAALhAsAC4sLAACS
+ AAAAmwAACZIJAAqdCgATgxMAFIoUABuBGwAcixwAEZERABGdEQAalRoAGZkZAACjAAAArAAAC6ILAAmo
+ CQAAswAAALwAAAu5CwAUpRQAFLEUABG6EQAdth0AGbkZACOBIwAiiiIALIQsACyJLAAjkiMAIZshACmU
+ KQAqnCoAM4MzADWKNQA7hjsAO4s7ADSXNAAynTIAPZY9ADucOwAppSkAIrUiACG7IQAquSoAMqMyADGr
+ MQA8ojwAO6g7ADi+OAAAxAAAAMsAAA7FDgAA0wAAANsAAA7UDgAO2w4AEsMSABPUEwAA4wAAAOoAAA7h
+ DgAL6QsAAPEAACjHKAAm3CYANME0ADLKMgA7xjsAN9g3ACfhJwBChkIARIlEAEuMSwBNkk0AVYVVAFWV
+ VQBCo0IAQ6hDAEmkSQBMqkwARbRFAFarVgBVslUAXrZeAF24XQBgiGAAYpxiAHWTdQBkoGQAZbNlAGK4
+ YgBqtWoAbLpsAHWndQBysHIAcrtyAHi+eABBwkEARchFAE7NTgBO204AVcZVAFTKVABZylkAVtVWAFnS
+ WQBA4EAAYMdgAGHTYQBq02oAc8JzAHDLcAB7w3sAfs1+AHLTcgBy2XIAe9Z7AH7cfgBg6mAAcONwAIGC
+ gQCMjIwAlJSUAJaYlgCZmZkAjqGOAIm2iQCYp5gAlriWAKKiogChqaEAq6urAKi3qAC4uLgAg8WDAIPK
+ gwCLy4sAgNWAAIHcgQCM1IwAi9yLAJHFkQCQzJAAn8efAJnLmQCX1ZcAgOaAAJLhkgCb45sAkPCQAKfE
+ pwCi1qIAp9qnAKnVqQCr2qsAvMK8ALHTsQC02rQAvNa8ALveuwCl46UAsOKwALLssgC55LkAuey5AMPE
+ wwDNzc0AwtnCANXV1QDa2toAxOXEAMLrwgDL48sAzOjMAMjwyADU69QA2vLaAOTk5ADs7OwA5fPlAOD5
+ 4ADr9esA7vnuAPLy8gDy+vIA/v7+AAAAAAD/////////////////////////////////////////////
+ /////////////////////////////////////////8mikGcvJRwcJCw0j5zJ////////////////////
+ /////////////////////8miZyMgHR0dHBwcFxcXFxYZNJzJ////////////////////////////////
+ ///JnWAhISAgIB0dHRwcHBcXFxcWFhYsnMn//////////////////////////////6JjQUEhISEgICAd
+ HR0cHBwXFxcXFhYWFC6c///////////////////////////JlkJCQUFBISEhICAgHR0dHBwcFxcXFxYW
+ FhQUj8n//////////////////////8V0RUJCQkFBQSEhISAgIB0dHRwcHBcXFxcWFhYUFDPE////////
+ ////////////w21FRUVCQkJBQUEhISEgICAdHR0cHBwXFxcXFhYWFBQuwv/////////////////FbUZG
+ RUVFQkJCQUFBISEhICAgHR0dHBwcFxcXFxYWFhQULsT//////////////8l0UUZGRkVFRUJCQkFBQSEh
+ ISAgIB0dHRwcHBcXFxcWFhYUFDPJ/////////////5dRUVFGRkZFRUVHTU1NRENBISEgICAdHR0dHiUl
+ JSQZFxYWFBSP////////////pFJSUVFRRkZIWG1tdJKSbGpjSiEhICAgIigvYGdni2dnLyYZFhQUnP//
+ ///////JcFJSUlFRUVhtbXSVl5+kpKSfbEwhISAjS2BnjpCdnaKinYssGRYULsn///////+fVVVSUlJS
+ UVhtbbPd4ujo3d3TpGpJISEjS2Ci2+Hi4uHbxaKLJBYWFJz//////9twVVVVUlJRUVjT+/7+/v7+/v71
+ tZNKISAhw/j+/v7+/v7+/sOOJxYWFizJ/////7NWVlVVUkZFbfT+/v7+/v7+/v71pJNBICLs/v7+/v7+
+ /v7+/qKOJxcWFhac/////4hWVlZVUUJK6vz+/v7tyL69yP7vlGogHsn2/v7+9sq+vcT874tnJxcXFhY0
+ ////23h2VlZSQiCc6vz+/u3ANxANKsCkT0Icj8r2/v7tyDoQDRG92ygvJRcXFxYZyf//tXZ2dlZGICzA
+ 6v7+/NsiFgQDAxtgQR0bvsr8/v7sLBMBAAAGNBwfHhcXFxcWnP//q3d2dlVCHDrA7f7++1hCIR0XFx0g
+ IBYqvur+/v5sHRcUFBMUFhwcHBwXFxcXj///iHd3dlIhFDnA9v7+1lxSRkVCQkJBHBM3vu3+/uhKQSAd
+ HRwcHBwdHBwcFxcXNP//hHd3d1EdFTnA/P7+sYZcUlFRRkZBFwM4vvb+/sxqYUEhISAgHR0dHRwcHBcX
+ LP//fnl3d0YcCDjA/v7+q6dvUlJRUVFBFgE2vvz+/qSSYUEhISEgICAdHR0cHBwXJP//eXl5d0YXCDbA
+ /v77satvUlJSUVFBFAI1vv7+/p+XY0FBISEhICAgHR0dHBwcHP//enl5eUYXCDXA/v7+t65wVVJSUlFB
+ FAI1vf7+/rOfakRBQSEhISAgIB0dHRwcHP//fnp5eUYXCDW+/v7+z7KIV1VSUlFBFAE1Pvz+/t2zkk1B
+ QUEhISEgICAdHR0cJf//hXp6eVEXBTU+/P7+2c+ub1VVVVJFFwE1Oe3+/ujMn2NEQUFBQSEhICAgHR0d
+ L///iXp6elIcAxE46v7+9dnPp4RcXG9SIAEQNcj+/vjWzJdtT0xhYUxJISAgIB0dZ///rnp6elYhAxA1
+ vv7+/ujZz66np6unURMINT7+/v7v3cyfkpKUl5NjQyEgICAdkP//tX96endFEwU1OOr+/v7o1rexsdnd
+ hh0BETXI/v7+79a1n5/M76RsSiEhICAgov//24F/enlVHQMQNT7t/v7++Ojw+/7wrkUBCDU46v7+/vjv
+ 6Pj++LWTTCEhISAjyf///4l/f3p3RRQDETU56v7+/v7+/v7oq1UWARA1OMj+/v7+/v7+9Z+SSkEhISFn
+ /////7d/f396ViEEAxA1Nb3J7e32/v7ZiFchBAENNTU+yOzt7fz+73RqTUFBISGi/////9uFf39/eVUh
+ EwMIETU1ODk+vsmIXFdGHQQBAhA1NTY5Ob3En01PREFBQWDJ//////+yf39/enlVQhcDAwUICAgaF0FR
+ VlZVRiEWAwEBBwcHCBUXIUJHQkJBQZ3////////bin9/f3p5dlFBHRcXFxcdIUZSVlZWVVFCIBcUFBQU
+ FhcgQUJFQkJCY8n/////////t4B/f39/enl2VVJRRlFRUlVWVlZWVlVSUUVCQSEhQUFCRUVFRUJCov//
+ /////////66Af39/f3p6enp5eXl3d3d2dnZWVlZVVVVSUlJRUVFGRkZFRUWW/////////////9uJgH9/
+ f396enp6eXl5d3d3dnZ2VlZWVVVVUlJSUVFRRkZGRXTJ///////////////TioB/f39/enp6enl5eXd3
+ d3Z2dlZWVlVVVVJSUlFRUUZGbcX/////////////////04qAf39/f3p6enp5eXl3d3d2dnZWVlZVVVVS
+ UlJRUVFtw////////////////////9OJgH9/f396enp6eXl5d3d3dnZ2VlZWVVVVUlJSUXTF////////
+ ///////////////broB/f39/enp6enl5eXd3d3Z2dlZWVlVVVVJSl8n/////////////////////////
+ /7eKf39/f3p6enp5eXl3d3d2dnZWVlZVVXCk///////////////////////////////bsoV/f396enp6
+ eXl5d3d3dnZ2VlZwn8n//////////////////////////////////9u3iYF/enp6enl5eXd3d3Z4iLPb
+ /////////////////////////////////////////9u1romFfnp5foSIq7Xb////////////////////
+ //////////////////////////////////////////////////////////////////////////8AAP//
+ gAH//wAA//wAAD//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/
+ AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAf
+ AAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/gAAAH/wAA//AAAA//AAD//AAAP/8AAP//
+ gAH//wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAr
+ AAAMLQwAADMAAAA7AAAJNQkACDkIABAuEAARNREAEjkSABgyGAAYOBgAIC4gACAyIAAkOyQAKDcoACg6
+ KAAzPDMAOT05AABDAAAATAAADkQOAABTAAAAWwAACVUJAAtaCwATRhMAElcSAABjAAAAawAACmYKAAxp
+ DAAAcwAAAHsAAAxyDAAMewwAEmISABNpEwAZZBkAG2sbABV2FQA6SToANVI1ACJmIgAiaiIAKGcoAC5o
+ LgAjdyMAI30jAC10LQAreSsAO287ADh2OABAQEAATE1MAEhaSABSUlIAXFxcAE1kTQBId0gAXWJdAFp+
+ WgBpaWkAcnJyAHx8fAAAgwAAAIsAAAuECwALiwsAAJIAAACbAAAJkgkACp0KABODEwAUihQAG4EbAByL
+ HAARkREAEZ0RABqVGgAZmRkAAKMAAACsAAALogsACagJAACzAAAAvAAAC7kLABSlFAAUsRQAEboRAB22
+ HQAZuRkAI4EjACKKIgAshCwALIksACOSIwAhmyEAKZQpACqcKgAzgzMANYo1ADuGOwA7izsANJc0ADKd
+ MgA9lj0AO5w7ACmlKQAitSIAIbshACq5KgAyozIAMasxADyiPAA7qDsAOL44AADEAAAAywAADsUOAADT
+ AAAA2wAADtQOAA7bDgASwxIAE9QTAADjAAAA6gAADuEOAAvpCwAA8QAAKMcoACbcJgA0wTQAMsoyADvG
+ OwA32DcAJ+EnAEKGQgBEiUQAS4xLAE2STQBVhVUAVZVVAEKjQgBDqEMASaRJAEyqTABFtEUAVqtWAFWy
+ VQBetl4AXbhdAGCIYABinGIAdZN1AGSgZABls2UAYrhiAGq1agBsumwAdad1AHKwcgByu3IAeL54AEHC
+ QQBFyEUATs1OAE7bTgBVxlUAVMpUAFnKWQBW1VYAWdJZAEDgQABgx2AAYdNhAGrTagBzwnMAcMtwAHvD
+ ewB+zX4ActNyAHLZcgB71nsAftx+AGDqYABw43AAgYKBAIyMjACUlJQAlpiWAJmZmQCOoY4AibaJAJin
+ mACWuJYAoqKiAKGpoQCrq6sAqLeoALi4uACDxYMAg8qDAIvLiwCA1YAAgdyBAIzUjACL3IsAkcWRAJDM
+ kACfx58AmcuZAJfVlwCA5oAAkuGSAJvjmwCQ8JAAp8SnAKLWogCn2qcAqdWpAKvaqwC8wrwAsdOxALTa
+ tAC81rwAu967AKXjpQCw4rAAsuyyALnkuQC57LkAw8TDAM3NzQDC2cIA1dXVANra2gDE5cQAwuvCAMvj
+ ywDM6MwAyPDIANTr1ADa8toA5OTkAOzs7ADl8+UA4PngAOv16wDu+e4A8vLyAPL68gD+/v4AAAAAAP//
+ /////////////////////////////////////////////////////8mikGUoHBwlNI+cyf//////////
+ /////////////8mdXiEgIB0dHBwXFxYrmsf//////////////////+CiYUFBISEgIB0dHBwXFxYWK5zg
+ ///////////////JlkVCQkFBISEgIB0dHBwXFxYWFI/J////////////yZRGRUVCQkFBISEgIB0dHBwX
+ FxYWFDvJ/////////+CXUUZGRUVFREpKSSMhIB0dHx8lJSQZFo/g////////pFJRUUZGTmJxkZORbEwj
+ IihdZYuLizQmGJz//////8luUlJRUVNYcpWfpKSgk15JXWiQnaKimzQkLcf/////n1VVUlFRUVjM3vTs
+ 79KWYyNg0uL07OzDjywWmv///9tvVlVSRkVt9P7+/v7+4pRDlvv+/v7+/sONLBcryf//tXZWVlFCI8n+
+ /v7gyffNRGbu/v78yeD+jjIlFxac//+qdnZWRR07yv7+kxcUJDIXnO3++ywTBC4cHx8XF4///4d3dnZB
+ Fjzg/uVGIRwXFBVA7v6gHRYUFhwcHBwXNP//fnd3diATPOv+uXBUQh0TCD/8/nNhIR0dHR0dHBwl//95
+ eXd3HQM47v7RrHVRIRMHPv7+npZhISAgIB0dHBz//3p5eXcdAzXr/tm5rG5CFgc8/v7LtZRhSUkjIB0d
+ HP//fnp5eR0DEsf+89nPrFkgBTju/t7WtZaTbEwjIB0o//+Jenp5IQMQPP7+5dnPrFkUEr7++NbNtcue
+ bEkgIGX//61/enpFEwUSvv7+8+/7tx0KNcr+++/v/qSTTCEgkP//tn9/elUdAws1QO7+/v65QQEQNcH3
+ /v7+l3NMISGi///bhX9/d0YXAwUQNkDJ3nVCFAEIETi+ydZxYURBXsn///+xf396dkYdEwMDExdBRkYh
+ FAMBAQMWIEJFREGd/////9uKf396d1JFIR0gIUVSUlFCIBwXFx0hQkVCYcn//////7eAf39/enp5eXd3
+ dnZWVlVVUlJRUUZGRUWi////////4K2Af39/enp5eXd3dnZWVlVVUlJRUUZGluD/////////26mAf39/
+ enp5eXd3dnZWVlVVUlJRUZTJ////////////262Af39/enp5eXd3dnZWVlVVUlKXyf//////////////
+ 4LeKf39/enp5eXd3dnZWVlVupOD//////////////////9uxhX9/enp5eXd3dnZvn8n/////////////
+ ///////////btq2Jfnp5foeqtdv/////////////////////////////////////////////////////
+ /////////8AD//8AAP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AAAAPAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8A
+ AP//wAP//////ygAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAACsAAAwt
+ DAAAMwAAADsAAAk1CQAIOQgAEC4QABE1EQASORIAGDIYABg4GAAgLiAAIDIgACQ7JAAoNygAKDooADM8
+ MwA5PTkAAEMAAABMAAAORA4AAFMAAABbAAAJVQkAC1oLABNGEwASVxIAAGMAAABrAAAKZgoADGkMAABz
+ AAAAewAADHIMAAx7DAASYhIAE2kTABlkGQAbaxsAFXYVADpJOgA1UjUAImYiACJqIgAoZygALmguACN3
+ IwAjfSMALXQtACt5KwA7bzsAOHY4AEBAQABMTUwASFpIAFJSUgBcXFwATWRNAEh3SABdYl0AWn5aAGlp
+ aQBycnIAfHx8AACDAAAAiwAAC4QLAAuLCwAAkgAAAJsAAAmSCQAKnQoAE4MTABSKFAAbgRsAHIscABGR
+ EQARnREAGpUaABmZGQAAowAAAKwAAAuiCwAJqAkAALMAAAC8AAALuQsAFKUUABSxFAARuhEAHbYdABm5
+ GQAjgSMAIooiACyELAAsiSwAI5IjACGbIQAplCkAKpwqADODMwA1ijUAO4Y7ADuLOwA0lzQAMp0yAD2W
+ PQA7nDsAKaUpACK1IgAhuyEAKrkqADKjMgAxqzEAPKI8ADuoOwA4vjgAAMQAAADLAAAOxQ4AANMAAADb
+ AAAO1A4ADtsOABLDEgAT1BMAAOMAAADqAAAO4Q4AC+kLAADxAAAoxygAJtwmADTBNAAyyjIAO8Y7ADfY
+ NwAn4ScAQoZCAESJRABLjEsATZJNAFWFVQBVlVUAQqNCAEOoQwBJpEkATKpMAEW0RQBWq1YAVbJVAF62
+ XgBduF0AYIhgAGKcYgB1k3UAZKBkAGWzZQBiuGIAarVqAGy6bAB1p3UAcrByAHK7cgB4vngAQcJBAEXI
+ RQBOzU4ATttOAFXGVQBUylQAWcpZAFbVVgBZ0lkAQOBAAGDHYABh02EAatNqAHPCcwBwy3AAe8N7AH7N
+ fgBy03IActlyAHvWewB+3H4AYOpgAHDjcACBgoEAjIyMAJSUlACWmJYAmZmZAI6hjgCJtokAmKeYAJa4
+ lgCioqIAoamhAKurqwCot6gAuLi4AIPFgwCDyoMAi8uLAIDVgACB3IEAjNSMAIvciwCRxZEAkMyQAJ/H
+ nwCZy5kAl9WXAIDmgACS4ZIAm+ObAJDwkACnxKcAotaiAKfapwCp1akAq9qrALzCvACx07EAtNq0ALzW
+ vAC73rsApeOlALDisACy7LIAueS5ALnsuQDDxMMAzc3NAMLZwgDV1dUA2traAMTlxADC68IAy+PLAMzo
+ zADI8MgA1OvUANry2gDk5OQA7OzsAOXz5QDg+eAA6/XrAO757gDy8vIA8vryAP7+/gAAAAAA////////
+ ///////////////////Fm2AiHzGaxP////////+jYkEhIB0cFyuc//////+kU0ZFQSEgHRwXGZz////F
+ blJRRkVBISAdHBcrxP//sFZa5vDvcWrh7OwcF5r//4R29f7l5pX9/tLsHRwx//97if7nVVKV/tNBISAd
+ H///fK/+11ZVpv7MRUEhICL//4WK/vl2Vob+5kZFQSFg//+xf9r++f598P70/kVBm///1Yp/u9e8fX23
+ zrRGYsX///+3gn96eXd2VlVSU6P//////7eKf3p5d3ZWbqT/////////1bGFfHuEsMX/////////////
+ ////////////////yW7wD1FR4AdylcADpKCAAUldgAGdooABNCSAAf//gAGfVYABUVGAAczegAHv0sAD
+ I2DgB/Ts8A+PLP////8oAAAAMAAAAGAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAcQAoAG0AXABrAIkAaQCxAGYA0gBkAOoAYQD6AF8A+gBdAOoAWgDSAFgAsQBV
+ AIkAUwBcAFEAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAewAdAHkAZwB1AKwAcwDtAHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBf
+ AP8AXQD/AFoA/wBYAP8AVQD/AFMA7QBRAKwATwBnAE0AHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAIMAIQCBAHgAfQDNAHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBp
+ AP8AZgD/AGQA/wBhAP8AXwD/AF0A/wBaAP8AWAD/AFUA/wBTAP8AUQD/AE8AzQBNAHgASwAhAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQBgAIUAwgCDAP8AgQD/AH0A/wB7AP8AeQD/AHUA/wBz
+ AP8AcQD/AG0A/wBrAP8AaQD/AGYA/wBkAP8AYQD/AF8A/wBdAP8AWgD/AFgA/wBVAP8AUwD/AFEA/wBP
+ AP8ATQDCAEsAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEAIwCOAJAAiwD7AIkA/wCFAP8AgwD/AIEA/wB9
+ AP8AewD/AHkA/wB1AP8AcwD/AHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBfAP8AXQD/AFoA/wBY
+ AP8AVQD/AFMA/wBRAP8ATwD/AE0A+wBLAJAASQAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgA7AJQAsACRAP8AjgD/AIsA/wCJ
+ AP8AhQD/AIMA/wCBAP8AfQD/AHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpAP8AZgD/AGQA/wBh
+ AP8AXwD/AF0A/wBaAP8AWAD/AFUA/wBTAP8AUQD/AE8A/wBNAP8ASwCwAEkAOwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAEIAmQDAAJYA/wCU
+ AP8AkQD/AI4A/wCLAP8AiQD/AIUA/wCDAP8AgQD/AH0A/wB7AP8AeQD/AHUA/wBzAP8AcQD/AG0A/wBr
+ AP8AaQD/AGYA/wBkAP8AYQD/AF8A/wBdAP8AWgD/AFgA/wBVAP8AUwD/AFEA/wBPAP8ATQD/AEsAwABJ
+ AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAOwCe
+ AMAAnAD/AJkA/wCWAP8AlAD/AJEA/wCOAP8AiwD/AIkA/wCFAP8AgwD/AIEA/wB9AP8AewD/AHkA/wB1
+ AP8AcwD/AHEA/wBtAP8AawD/AGkA/wBmAP8AZAD/AGEA/wBfAP8AXQD/AFoA/wBYAP8AVQD/AFMA/wBR
+ AP8ATwD/AE0A/wBLAMAASQA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAApwAjAKQAsAChAP8AngD/AJwA/wCZAP8AlgD/AJQA/wCRAP8AjgD/AIsA/wCJAP8AhQD/AIMA/wCB
+ AP8AfQD/AHsA/wB5AP8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpAP8AZgD/AGQA/wBhAP8AXwD/AF0A/wBa
+ AP8AWAD/AFUA/wBTAP8AUQD/AE8A/wBNAP8ASwCwAEkAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAqQCQAKcA/wCkAP8AoQD/AJ4A/wCcAP8AmQD/AJYA/wKVAv8GlAb/C5ML/xCS
+ EP8SkRL/EY0R/w+KD/8Khgr/BoAG/wJ8Av8BegH/AHUA/wBzAP8AcQD/AG0A/wBrAP8CagL/BmoG/wpq
+ Cv8Pag//EmoS/xJoEv8QZBD/C18L/wZZBv8CVAL/AVIB/wBPAP8ATQD/AEsAkAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvAGAArQD7AKkA/wCnAP8ApAD/AKEA/wGeAf8EngT/Cp0K/xWf
+ Ff8ioiL/MKYw/zqoOv9AqED/QqhC/0CkQP83njf/KJUo/xeJF/8JgAn/AnoC/wB1AP8BdAH/BHME/wpz
+ Cv8UdxT/IXwh/y6CLv85hzn/P4g//0KIQv9AhkD/OoA6/yt0K/8aZhr/C1oL/wNTA/8ATwD/AE0A+wBL
+ AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUAIQCxAMIArwD/AK0A/wCpAP8ApwD/AaQB/waj
+ Bv8QpBD/Hacd/yyrLP89rz3/TLRM/1u4W/9kumT/bLxs/3G9cf9wu3D/YbJh/0ChQP8djB3/B38H/wF6
+ Af8EdwT/DXoN/xp/Gv8rhiv/O407/0yWTP9Ym1j/YqBi/2qjav9wpXD/cqVy/2acZv9JiEn/Imwi/wpa
+ Cv8AUQD/AE8A/wBNAMIASwAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALcAeAC1AP8AsQD/AK8A/wCt
+ AP8AqQD/AqgC/wemB/8SqBL/IKog/zGvMf9yx3L/qtyq/7Hfsf+24Lb/vOG8/63Zrf+n1qf/jsmO/224
+ bf84nTj/EIUQ/wF8Af8EewT/DXwN/xyCHP8viy//cq9y/5/Hn/+w0bD/tdO1/7rVuv+yz7L/p8en/5K6
+ kv92pnb/QYNB/xRiFP8AUwD/AFEA/wBPAP8ATQB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAvQAdALkAzQC3
+ AP8AtQD/ALEA/wCuAP8AqgD/AKMA/wCiAP8UqxT/jNSM//P68///////////////////////////////
+ ////////4PDg/3/Cf/9Jpkn/E4oT/wB5AP8AdgD/AHkA/4m/if/l8eX/////////////////////////
+ //////////////n8+f+Gsob/Uo9S/xxqHP8AVQD/AFMA/wBRAP8ATwDNAE0AHQAAAAAAAAAAAAAAAAAA
+ AAAAvwBnAL0A/wC5AP8AtwD/ALQA/wCrAP8AnwD/AJUA/yqiKv/W6db/////////////////////////
+ ////////////////////////3/Df/3C9cP9JqEn/B4YH/wBwAP8Ocg7/wdbB////////////////////
+ //////////////////////////////////9xpnH/T49P/x1tHf8AWAD/AFUA/wBTAP8AUQD/AE8AZwAA
+ AAAAAAAAAAAAAAAAAAAAwQCsAL8A/wC9AP8AuQD/ALIA/wCiAP8AiwD/F4gX/77Gvv/s7Oz/////////
+ ////////1tbW/6qqqv+IiIj/gYGB/62trf/7+/v/zenN/0qtSv8xoDH/AHcA/wxmDP+hs6H/4+Pj////
+ /////////////+Hh4f+zs7P/jY2N/3x8fP+fn5//7Ozs/8vgy/9GjEb/PIU8/xhsGP8AWgD/AFgA/wBV
+ AP8AUwD/AFEArAAAAAAAAAAAAAAAAADHACgAxQDtAMEA/wC/AP8AvAD/AKsA/wCOAP8AdAD/eZV5/8DA
+ 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
+ //+54rn/iMyI/2G5Yf8nnSf/B4wH/wGFAf8BgwH/BIME/weBB/8Hfwf/BHsE/wF2Af8AcwD/AHEA/wBt
+ AP8AawD/AGkA/wBmANIAAAAAAAAAAADfALEA3QD/ANoA/wDYAP8ArwD/AGcA/wA0AP84Pjj/UFBQ/8XF
+ xf///////////9r22v+b5pv/f95//03OTf8nwif/Gr0a/xy6HP8iuiL/Bq8G/wBzAP8AKwD/LDks/0BA
+ QP+srKz////////////m9Ob/m9Wb/4XKhf9VtFX/K58r/xuVG/8bkhv/IpQi/yWTJf8gjSD/EoQS/wZ8
+ Bv8AdQD/AHMA/wBxAP8AbQD/AGsA/wBpALEAAAAAAAAAAADhAIkA3wD/AN0A/wDaAP8AvgD/AHoA/wA1
+ AP8kOyT/QEBA/4+Pj/////////////////+37rf/nead/3/ef/9a0lr/RcpF/0bJRv9SylL/RMRE/wCi
+ AP8AQwD/GDIY/0BAQP92dnb/+vr6////////////x+jH/6DXoP+EyoT/X7hf/0arRv9DqEP/T6tP/1iu
+ WP9Kpkr/KZIp/w2CDf8AeQD/AHUA/wBzAP8AcQD/AG0A/wBrAIkAAAAAAAAAAADjAFwA4QD/AN8A/wDd
+ AP8AywD/AJUA/wBEAP8INgj/QEBA/1BQUP/FxcX////////////5/vn/tO20/5Hjkf9z23P/XtNe/2PT
+ Y/+b4pv/rOWs/zfAN/8AawD/ACoA/zg9OP9AQED/rKys////////////+f35/8DlwP+V05X/ecV5/164
+ Xv9etl7/hceF/8Hhwf9wuXD/QKFA/xWIFf8AewD/AHkA/wB1AP8AcwD/AHEA/wBtAFwAAAAAAAAAAADl
+ ACgA4wDtAOEA/wDfAP8A1gD/ALEA/wBoAP8ANQD/JDsk/0BAQP9nZ2f/2tra/////////////////+r6
+ 6v+67rr/xvDG/+767v//////xu7G/1vNW/8AlQD/AC8A/xQxFP9AQED/U1NT/8TExP//////////////
+ ///q9+r/xebF/7zivP/k8+T//////+Xz5f97wHv/S6dL/xmNGf8AfQD/AHsA/wB5AP8AdQD/AHMA7QBx
+ ACgAAAAAAAAAAAAAAAAA5QCsAOMA/wDhAP8A3QD/AMkA/wCUAP8ASAD/ADUA/zQ+NP9AQED/YmJi/7+/
+ v///////////////////////////////////////ueu5/1XOVf8AsQD/AFIA/wArAP8oOCj/QEBA/1JS
+ Uv+tra3//////////////////////////////////////93v3f9muGb/RKZE/xeOF/8AgQD/AH0A/wB7
+ AP8AeQD/AHUArAAAAAAAAAAAAAAAAAAAAAAA5wBnAOUA/wDjAP8A4QD/ANgA/wC6AP8AfwD/ADoA/wQ2
+ BP8oPCj/QEBA/0NDQ/99fX3/sLCw/9HR0f/Z2dn/4ODg//v7+///////muOa/zfHN/8NuQ3/AHwA/wA6
+ AP8AKwD/IDUg/0BAQP9AQED/cXFx/6ioqP/Nzc3/2tra/9vb2//x8fH//////8zozP88pjz/MJ8w/xGN
+ Ef8AgwD/AIEA/wB9AP8AewD/AHkAZwAAAAAAAAAAAAAAAAAAAAAA6QAdAOcAzQDlAP8A4wD/AOAA/wDU
+ AP8AswD/AHwA/wBBAP8ANQD/FDgU/zQ+NP9AQED/QEBA/1BQUP9ZWVn/aGho/42Njf+euZ7/PcY9/xO+
+ E/8Lugv/AJ4A/wBvAP8APgD/ACsA/wwuDP8sOSz/QEBA/0BAQP9NTU3/WFhY/2JiYv+AgID/naqd/2ex
+ Z/8QlRD/GJYY/wqOCv8AhQD/AIMA/wCBAP8AfQDNAHsAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAOkAeADn
+ AP8A5QD/AOMA/wDeAP8A0wD/ALcA/wCKAP8AWwD/ADUA/wA1AP8INgj/EDcQ/xA2EP8ROBH/FUcV/wde
+ B/8AgAD/AKYA/wC8AP8EugT/ALEA/wCbAP8AeQD/AFIA/wAxAP8AKgD/BCsE/xAvEP8QLhD/EC4Q/xQ4
+ FP8ORg7/AFsA/wB5AP8AjQD/B5EH/wSNBP8AiQD/AIUA/wCDAP8AgQB4AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAOsAIQDpAMIA5wD/AOUA/wDjAP8A3wD/ANYA/wDDAP8ApgD/AIYA/wBrAP8AXgD/AFkA/wBa
+ AP8AXwD/AGoA/wB+AP8AmAD/AK0A/wC6AP8AvQD/ALgA/wCxAP8AowD/AIwA/wByAP8AWwD/AEwA/wBH
+ AP8ARwD/AEoA/wBRAP8AXgD/AHAA/wCCAP8AjgD/AJEA/wGOAf8AiwD/AIkA/wCFAMIAgwAhAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADrAGAA6QD7AOcA/wDlAP8A4wD/AOAA/wDcAP8A0gD/AMMA/wC0
+ AP8AqAD/AKEA/wCfAP8AoAD/AKYA/wCuAP8AtwD/AL4A/wC/AP8AvwD/AL0A/wC4AP8AtQD/AK4A/wCh
+ AP8AlQD/AIoA/wCBAP8AfwD/AH8A/wCBAP8AhwD/AI4A/wCSAP8AlAD/AJMA/wCRAP8AjgD/AIsA+wCJ
+ AGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6wCQAOkA/wDnAP8A5QD/AOMA/wDh
+ AP8A3wD/AN0A/wDaAP8A2AD/ANUA/wDTAP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9
+ AP8AuQD/ALcA/wC1AP8AsQD/AK8A/wCtAP8AqQD/AKcA/wCkAP8AoQD/AJ4A/wCcAP8AmQD/AJYA/wCU
+ AP8AkQD/AI4AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAjAOsAsADp
+ AP8A5wD/AOUA/wDjAP8A4QD/AN8A/wDdAP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDH
+ AP8AxQD/AMEA/wC/AP8AvQD/ALkA/wC3AP8AtQD/ALEA/wCvAP8ArQD/AKkA/wCnAP8ApAD/AKEA/wCe
+ AP8AnAD/AJkA/wCWAP8AlACwAJEAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAO0AOwDrAMAA6QD/AOcA/wDlAP8A4wD/AOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDR
+ AP8AzgD/AMwA/wDJAP8AxwD/AMUA/wDBAP8AvwD/AL0A/wC5AP8AtwD/ALUA/wCxAP8ArwD/AK0A/wCp
+ AP8ApwD/AKQA/wChAP8AngD/AJwA/wCZAMAAlgA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtAEIA6wDAAOkA/wDnAP8A5QD/AOMA/wDhAP8A3wD/AN0A/wDa
+ AP8A2AD/ANUA/wDTAP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9AP8AuQD/ALcA/wC1
+ AP8AsQD/AK8A/wCtAP8AqQD/AKcA/wCkAP8AoQD/AJ4AwACcAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QA7AOsAsADpAP8A5wD/AOUA/wDj
+ AP8A4QD/AN8A/wDdAP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDHAP8AxQD/AMEA/wC/
+ AP8AvQD/ALkA/wC3AP8AtQD/ALEA/wCvAP8ArQD/AKkA/wCnAP8ApACwAKEAOwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AIwDr
+ AJAA6QD7AOcA/wDlAP8A4wD/AOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDRAP8AzgD/AMwA/wDJ
+ AP8AxwD/AMUA/wDBAP8AvwD/AL0A/wC5AP8AtwD/ALUA/wCxAP8ArwD/AK0A+wCpAJAApwAjAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAA6wBgAOkAwgDnAP8A5QD/AOMA/wDhAP8A3wD/AN0A/wDaAP8A2AD/ANUA/wDT
+ AP8A0QD/AM4A/wDMAP8AyQD/AMcA/wDFAP8AwQD/AL8A/wC9AP8AuQD/ALcA/wC1AP8AsQDCAK8AYAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsAIQDpAHgA5wDNAOUA/wDjAP8A4QD/AN8A/wDd
+ AP8A2gD/ANgA/wDVAP8A0wD/ANEA/wDOAP8AzAD/AMkA/wDHAP8AxQD/AMEA/wC/AP8AvQD/ALkAzQC3
+ AHgAtQAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6QAdAOcAZwDl
+ AKwA4wDtAOEA/wDfAP8A3QD/ANoA/wDYAP8A1QD/ANMA/wDRAP8AzgD/AMwA/wDJAP8AxwD/AMUA7QDB
+ AKwAvwBnAL0AHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAA5QAoAOMAXADhAIkA3wCxAN0A0gDaAOoA2AD6ANUA+gDTAOoA0QDSAM4AsQDM
+ AIkAyQBcAMcAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//4AB//8AAP/8AAA//wAA//AAAA//
+ AAD/4AAAB/8AAP+AAAAB/wAA/wAAAAD/AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAAD4AAAAAB8AAPAA
+ AAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8A
+ AAAA/wAA/4AAAAH/AAD/4AAAB/8AAP/wAAAP/wAA//wAAD//AAD//4AB//8AAP///////wAAKAAAACAA
+ AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ABoAdABYAHAAjgBsALwAaADgAGQA9wBgAPcAXQDgAFkAvABV
+ AI4AUgBYAE8AGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEACsAgACAAHwA0QB4AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBg
+ AP8AXQD/AFkA/wBVAP8AUgDRAE8AgABMACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRAAEAjQBoAIgAzQCEAP8AgAD/AHwA/wB4AP8AdAD/AHAA/wBs
+ AP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8AzQBMAGgASQABAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAYAJUAjACRAP8AjQD/AIgA/wCEAP8AgAD/AHwA/wB4
+ AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8A/wBMAIwASQAYAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAGACdAJgAmQD/AJUA/wCRAP8AjQD/AIgA/wCE
+ AP8AgAD/AHwA/wB4AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBgAP8AXQD/AFkA/wBVAP8AUgD/AE8A/wBM
+ AJgASQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqAAEApQCMAKEA/wCdAP8AmQD/AZUB/wOS
+ A/8HkAf/Do8O/xONE/8VihX/EoUS/w1/Df8HeAf/AnEC/wFtAf8EagT/CWkJ/w9pD/8TaRP/FGYU/xFg
+ Ef8LWQv/BVIF/wFNAYwASQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4AaACqAP8ApQD/AKEA/wGd
+ Af8HnAf/EJwQ/yCfIP8xozH/QKZA/0emR/9DoUP/NJc0/x+IH/8PfA//C3YL/xV4Ff8lfiX/NoU2/0KJ
+ Qv9Hikf/QINA/zB1MP8ZYxn/CVUJ/wNOA2kAAAAAAAAAAAAAAAAAAAAAAAAAAAC2ACsAsgDNAK4A/wCq
+ AP8ApQD/A6ID/wuhC/8bpBv/Makx/0mwSf9guGD/c75z/3i+eP9qtWr/RqBG/yKKIv8WgBb/IoMi/zqN
+ Ov9Ql1D/ZaFl/3Wpdf93qXf/Ypli/zp8Ov8WYRb/BFIEzgBMACsAAAAAAAAAAAAAAAAAAAAAALoAgAC2
+ AP8AsgD/AK0A/wCnAP8AoAD/AKAA/xOkE/+AzID/p9qn/9rv2v+/4r//xeTF/5LKkv9drl3/KJEo/w1/
+ Df8rjCv/ksKS/7bVtv/S5NL/wdrB/7/Xv/+EsYT/UY5R/yJsIv8FVQX/AE8AgAAAAAAAAAAAAAAAAADC
+ ABoAvgDRALoA/wC2AP8ArAD/AJ0A/wCQAP8roSv/0e7R////////////////////////////tt22/06q
+ Tv8Ohw7/Xahd//H48f///////////////////////////4y4jP9LjUv/Im8i/wVYBf8AUgDRAE8AGgAA
+ AAAAAAAAAMYAWADCAP8AvgD/ALoA/wCjAP8AiAD/C3wL/6+/r/////////////////+1xLX/r72v/+zs
+ 7P+Ky4r/CYwJ/zeLN//g4OD////////////x8fH/o7Sj/8LHwv/8/Pz/TJJM/yp6Kv8XbBf/BFwE/wBV
+ AP8AUgBYAAAAAAAAAAAAygCOAMYA/wDCAP8AvgD/AJQA/wBsAP9FdUX/ubm5////////////T6FP/wBe
+ AP8ATwD/E18T/y15Lf8AXQD/e5B7/9TU1P//////7fTt/yRsJP8AQAD/ADwA/y5oLv8AYQD/CmoK/wpm
+ Cv8BXgH/AFkA/wBVAI4AAAAAAAAAAADOALwAygD/AMYA/wDCAP8AgQD/AFMA/1poWv++vr7//////6ni
+ qf8AnAD/AHoA/wBjAP8AWAD/AEsA/w1BDf99fX3/3d3d//////9qtWr/AG0A/wBVAP8ASgD/AFQA/wBh
+ AP8AZwD/AmUC/wBgAP8AXQD/AFkAvAAAAAAAAAAAANIA4ADOAP8AygD/AMYA/wByAP8APwD/XV1d/8/P
+ z///////fNV8/yy5LP8JqAn/AI0A/wBsAP8ARgD/EzQT/3BwcP/z8/P//////z2hPf8ikSL/AHoA/wBo
+ AP8AaQD/AGsA/wBrAP8AaAD/AGQA/wBgAP8AXQDgAAAAAAAAAAAA1QD3ANIA/wDOAP8AygD/AGoA/wAz
+ AP9SUlL/2dnZ//////+L3Iv/WcpZ/za8Nv8DpgP/AHoA/wBHAP8QLRD/ampq////////////ZLdk/1Ks
+ Uv8nkyf/AX0B/wB3AP8AdAD/AHAA/wBsAP8AaAD/AGQA/wBgAPcAAAAAAAAAAADZAPcA1QD/ANIA/wDO
+ AP8AaQD/ADIA/0RERP/Nzc3//////5/jn/9813z/WcpZ/yK1Iv8AjQD/AFAA/xAuEP9gYGD/////////
+ //+Cx4L/d8B3/0uoS/8hkCH/FocW/xKCEv8KeQr/A3ID/wBsAP8AaAD/AGQA9wAAAAAAAAAAAN0A4ADZ
+ AP8A1QD/ANIA/wBvAP8AMwD/OD44/6Kiov//////yPDI/5nimf+C2YL/WMpY/xaxFv8AcQD/DjUO/1BQ
+ UP/Z2dn//////6vbq/+X0Zf/eMB4/1WtVf9IpEj/Opo6/x+IH/8KeQr/AHAA/wBsAP8AaADgAAAAAAAA
+ AAAA4AC8AN0A/wDZAP8A1QD/AH0A/wA0AP8oOyj/X19f///////4/fj/pOak/5Pgk/9+2H7/XMtc/xKw
+ Ev8ASgD/OD04/46Ojv//////5PTk/53Vnf+OzI7/fsN+/4LDgv9ns2f/PZs9/xWDFf8AdAD/AHAA/wBs
+ ALwAAAAAAAAAAADjAI4A4AD/AN0A/wDZAP8AlAD/AEQA/wg1CP88Pzz/j4+P///////3/ff/yfDJ/8Ht
+ wf/v+u//a9Br/wBrAP8YMhj/QEBA/7u7u///////7/jv/8Hkwf/L58v/+Pz4/3a9dv9JpEn/G4ob/wF5
+ Af8AdAD/AHAAjgAAAAAAAAAAAOYAWADjAP8A4AD/AN0A/wCyAP8AbQD/ADUA/xg4GP9AQED/f39//9ra
+ 2v////////////////9713v/AIQA/wAtAP8oNyj/QEBA/5mZmf/u7u7/////////////////VbBV/z2h
+ Pf8ZjBn/AX0B/wB4AP8AdABYAAAAAAAAAAAA6QAaAOYA0QDjAP8A4AD/AMsA/wCdAP8AXQD/ADUA/ww2
+ DP8oOyj/SExI/3l5ef+tra3/qdGp/z2/Pf8AjwD/AE0A/wArAP8UMBT/MDow/1ZWVv+Ghob/srmy/5rO
+ mv82pTb/H5Yf/w+LD/8BgAH/AHwA0QB4ABoAAAAAAAAAAAAAAAAA6QCAAOYA/wDjAP8A2wD/AMUA/wCd
+ AP8AawD/AEQA/wA0AP8AMwD/AEAA/wBcAP8AggD/AJ4A/wCeAP8AewD/AE4A/wAwAP8AKQD/ACkA/wA4
+ AP8AUgD/AHEA/wCIAP8HkAf/BosG/wGEAf8AgACAAAAAAAAAAAAAAAAAAAAAAADtACsA6QDNAOYA/wDi
+ AP8A2gD/AMoA/wCvAP8AkQD/AHsA/wBvAP8AcAD/AH8A/wCWAP8AqQD/AK4A/wCiAP8AigD/AHEA/wBf
+ AP8AWQD/AF0A/wBrAP8AfQD/AIsA/wCQAP8BjQH/AIgAzQCEACsAAAAAAAAAAAAAAAAAAAAAAAAAAADt
+ AGgA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2
+ AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAP8AmQD/AJUA/wCRAP8AjQBoAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAO8AAQDtAIwA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDC
+ AP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAP8AmQD/AJUAjACRAAEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAO8AGADtAJgA6QD/AOYA/wDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDO
+ AP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQD/AKEA/wCdAJgAmQAYAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AGADtAIwA6QD/AOYA/wDjAP8A4AD/AN0A/wDZ
+ AP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgD/AK4A/wCqAP8ApQCMAKEAGAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAQDtAGgA6QDNAOYA/wDj
+ AP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgD/ALoA/wC2AP8AsgDNAK4AaACq
+ AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt
+ ACsA6QCAAOYA0QDjAP8A4AD/AN0A/wDZAP8A1QD/ANIA/wDOAP8AygD/AMYA/wDCAP8AvgDRALoAgAC2
+ ACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAA6QAaAOYAWADjAI4A4AC8AN0A4ADZAPcA1QD3ANIA4ADOALwAygCOAMYAWADC
+ ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////8AD//8A
+ AP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AAAAPAAAADgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP//////ygA
+ AAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH
+ ADQAfgCAAHUAwABtAO0AZQDtAF0AwABVAIAATQA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ
+ AGcAkADVAIcA/wB+AP8AdQD/AG0A/wBlAP8AXQD/AFUA1QBNAGcAAAAAAAAAAAAAAAAAAAAAAAAAAACr
+ AGcAogDxAJkA/wCQAP8AhwD/AH4A/wB1AP8AbQD/AGUA/wBdAP8AVQDxAE0AZwAAAAAAAAAAAAAAAAC9
+ ADQAtADVAKsA/wCiAP8AmQD/AJAA/wCHAP8AfgD/AHUA/wBtAP8AZQD/AF0A/wBVANUATQA0AAAAAAAA
+ AAAAxQCAAL0A/xC5EP+w5bD/wOjA/8DmwP8wpTD/MJ4w/7DXsP/A3cD/wNvA/wBlAP8AXQD/AFUAgAAA
+ AAAAAAAAAM0AwADFAP/Q89D//////6DgoP+w4rD/QLNA//D48P//////kMeQ/8DdwP8AbQD/AGUA/wBd
+ AMAAAAAAAAAAAADVAO0w1jD//////7DrsP8AtAD/AKsA/0C5QP//////kM+Q/wCHAP8AfgD/AHUA/wBt
+ AP8AZQDtAAAAAAAAAAAA3QDtQOBA//////+A4oD/AL0A/wC0AP9AwED//////4DMgP8AkAD/AIcA/wB+
+ AP8AdQD/AG0A7QAAAAAAAAAAAOUAwCDhIP//////4Png/wDFAP8AvQD/MMIw//////+w4rD/AJkA/wCQ
+ AP8AhwD/AH4A/wB1AMAAAAAAAAAAAADrAIAA5QD/kPCQ///////g+eD//////xDBEP/A7MD//////9Du
+ 0P//////AJAA/wCHAP8AfgCAAAAAAAAAAAAA8QA0AOsA1QDlAP9g6mD/gOqA/3DjcP8QyRD/EMEQ/3DV
+ cP+A1YD/cMtw/wCZAP8AkADVAIcANAAAAAAAAAAAAAAAAADxAGcA6wDxAOUA/wDdAP8A1QD/AM0A/wDF
+ AP8AvQD/ALQA/wCrAP8AogDxAJkAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAPEAZwDrANUA5QD/AN0A/wDV
+ AP8AzQD/AMUA/wC9AP8AtADVAKsAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8QA0AOsAgADl
+ AMAA3QDtANUA7QDNAMAAxQCAAL0ANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPAPAADgBwArwAMAzYAB
+ AP+AAQD/gAEA/4ABA/+AAQv/gAEb/4ABMf+AAUn/wANg/+AHc//wD3j///9q/w==
+
+
+
\ No newline at end of file
Index: CCTrayExtensions/WcfExtension.cs
===================================================================
--- CCTrayExtensions/WcfExtension.cs (revision 0)
+++ CCTrayExtensions/WcfExtension.cs (revision 0)
@@ -0,0 +1,134 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.Text;
+using System.Windows.Forms;
+using ThoughtWorks.CruiseControl.CCTrayLib.Configuration;
+using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ public class WcfExtension
+ : ITransportExtension
+ {
+ private Dictionary _projectManagers = new Dictionary();
+ private WcfServerManager _serverManager;
+ private string _settings;
+
+ public string DisplayName
+ {
+ get { return string.Format("{0}: {1}", this.Binding, this.Url); }
+ }
+
+ public string Settings
+ {
+ get { return _settings; }
+ set
+ {
+ this._settings = value;
+ this.Binding = (TransportBinding)Enum.Parse(typeof(TransportBinding), value);
+ }
+ }
+
+ public TransportBinding Binding { get; protected internal set; }
+ public string Url { get; set; }
+
+ public CCTrayProject[] GetProjectList(BuildServer server)
+ {
+ var client = OpenClient();
+ try
+ {
+ var projects = client.RetrieveProjects();
+ var projectList = from project in projects
+ select new CCTrayProject(server, project.Name);
+ return projectList.ToArray();
+ }
+ finally
+ {
+ client.Close();
+ }
+ }
+
+ public ICruiseProjectManager RetrieveProjectManager(string projectName)
+ {
+ WcfProjectManager projectManager = null;
+ if (!_projectManagers.ContainsKey(projectName))
+ {
+ projectManager = new WcfProjectManager(this, projectName);
+ _projectManagers.Add(projectName, projectManager);
+
+ return projectManager;
+ }
+ else
+ {
+ return _projectManagers[projectName];
+ }
+ }
+
+ public ICruiseServerManager RetrieveServerManager()
+ {
+ if (_serverManager == null) _serverManager = new WcfServerManager(this);
+ return _serverManager;
+ }
+
+ public bool Configure(IWin32Window owner)
+ {
+ var window = new WcfConfigurationWindow(this);
+ if (window.ShowDialog(owner) == DialogResult.OK)
+ {
+ this._settings = this.Binding.ToString();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ ///
+ /// Instantiates and opens a new WCF client to the server.
+ ///
+ ///
+ internal WcfClient.CruiseControlContractClient OpenClient()
+ {
+ System.ServiceModel.Channels.Binding binding = null;
+ switch (this.Binding)
+ {
+ case TransportBinding.BasicHttp:
+ binding = new BasicHttpBinding();
+ break;
+ case TransportBinding.NetTcp:
+ binding = new NetTcpBinding();
+ break;
+ case TransportBinding.WSHttp:
+ binding = new WSHttpBinding();
+ break;
+ case TransportBinding.NamedPipes:
+ binding = new NetNamedPipeBinding();
+ break;
+ default:
+ throw new NotImplementedException("Unknown transport protocol: " + this.Binding.ToString());
+ }
+ var endPoint = new EndpointAddress(Url);
+ var newClient = new WcfClient.CruiseControlContractClient(binding, endPoint);
+ newClient.Open();
+ return newClient;
+ }
+
+ ///
+ /// Helper method for closing a client.
+ ///
+ /// The client to close.
+ internal void CloseClient(WcfClient.CruiseControlContractClient client)
+ {
+ if ((client.State != CommunicationState.Closed) &&
+ (client.State != CommunicationState.Closing) &&
+ (client.State != CommunicationState.Faulted))
+ {
+ client.Close();
+ }
+ }
+ }
+}
Index: CCTrayExtensions/WcfHelpers.cs
===================================================================
--- CCTrayExtensions/WcfHelpers.cs (revision 0)
+++ CCTrayExtensions/WcfHelpers.cs (revision 0)
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using ThoughtWorks.CruiseControl.Remote;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ ///
+ /// Helper class for working with a WCF client.
+ ///
+ internal static class WcfHelpers
+ {
+ ///
+ /// Helper method for generating a dicitionary of project activities to use in mappings.
+ ///
+ ///
+ internal static Dictionary GenerateActivityDictionary()
+ {
+ var dictionary = new Dictionary();
+ dictionary.Add(ProjectActivity.Building.ToString(), ProjectActivity.Building);
+ dictionary.Add(ProjectActivity.CheckingModifications.ToString(), ProjectActivity.CheckingModifications);
+ dictionary.Add(ProjectActivity.Pending.ToString(), ProjectActivity.Pending);
+ dictionary.Add(ProjectActivity.Sleeping.ToString(), ProjectActivity.Sleeping);
+ return dictionary;
+ }
+
+ ///
+ /// Concerts a WCF snapshot to the cruise server snapshot.
+ ///
+ ///
+ ///
+ internal static CruiseServerSnapshot ConvertSnapshotFromWcf(WcfClient.Snapshot snapshot)
+ {
+ // Convert the projects statuses
+ var activityDictionary = GenerateActivityDictionary();
+ var projectStatuses = from project in snapshot.Projects
+ select new ProjectStatus(project.Name,
+ project.Category,
+ activityDictionary[project.Activity],
+ (IntegrationStatus)Enum.Parse(typeof(IntegrationStatus), project.BuildStatus),
+ (ProjectIntegratorState)Enum.Parse(typeof(ProjectIntegratorState), project.ProjectStatus),
+ project.WebUrl,
+ project.LastBuildTime,
+ project.LastBuildLabel,
+ project.LastSuccessfulBuildLabel,
+ project.NextBuildTime,
+ project.BuildStage);
+
+ // Convert the queues
+ var queueSnapshot = new QueueSetSnapshot();
+ foreach (var queue in snapshot.Queues)
+ {
+ var newQueue = new QueueSnapshot(queue.Name);
+ queueSnapshot.Queues.Add(newQueue);
+ foreach (var request in queue.Requests)
+ {
+ var activity = activityDictionary[request.Activity];
+ newQueue.Requests.Add(new QueuedRequestSnapshot(request.ProjectName, activity));
+ }
+ }
+
+ var newSnapshot = new CruiseServerSnapshot(projectStatuses.ToArray(), queueSnapshot);
+ return newSnapshot;
+ }
+ }
+}
Index: CCTrayExtensions/WcfProjectManager.cs
===================================================================
--- CCTrayExtensions/WcfProjectManager.cs (revision 0)
+++ CCTrayExtensions/WcfProjectManager.cs (revision 0)
@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ public class WcfProjectManager
+ : ICruiseProjectManager
+ {
+ private WcfExtension _extension;
+ private string _name;
+ private DateTime _cacheExpiry = DateTime.MinValue;
+ private WcfClient.Project _projectDetails;
+
+ public WcfProjectManager(WcfExtension extension, string projectName)
+ {
+ this._extension = extension;
+ this._name = projectName;
+ }
+
+ public void ForceBuild()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.ForceBuild(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public void FixBuild(string fixingUserName)
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.FixBuild(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public void AbortBuild()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.AbortBuild(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public void StopProject()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.StopProject(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public void StartProject()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.StartProject(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public void CancelPendingRequest()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ client.CancelPendingRequest(_name);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+
+ public string ProjectName
+ {
+ get { return this._name; }
+ }
+
+ public string ProjectIntegratorState
+ {
+ get { return RetrieveProject().ProjectStatus; }
+ }
+
+ private WcfClient.Project RetrieveProject()
+ {
+ // Cache the project so we are not calling the web service multiple times for an update
+ if (DateTime.Now > _cacheExpiry)
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ _projectDetails = client.RetrieveProject(_name);
+ _cacheExpiry = DateTime.Now.AddSeconds(5);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+ return _projectDetails;
+ }
+ }
+}
Index: CCTrayExtensions/WcfServerManager.cs
===================================================================
--- CCTrayExtensions/WcfServerManager.cs (revision 0)
+++ CCTrayExtensions/WcfServerManager.cs (revision 0)
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using ThoughtWorks.CruiseControl.CCTrayLib.Configuration;
+using ThoughtWorks.CruiseControl.Remote;
+using ThoughtWorks.CruiseControl.CCTrayLib.Monitoring;
+
+namespace ThoughtWorks.CruiseControl.CCTrayExtensions
+{
+ public class WcfServerManager
+ : ICruiseServerManager
+ {
+ private WcfExtension _extension;
+
+ public WcfServerManager(WcfExtension extension)
+ {
+ this._extension = extension;
+ }
+
+ public string ServerUrl
+ {
+ get { return _extension.Url; }
+ }
+
+ public string DisplayName
+ {
+ get { return _extension.DisplayName; }
+ }
+
+ public BuildServerTransport Transport
+ {
+ get { return BuildServerTransport.Extension; }
+ }
+
+ public void CancelPendingRequest(string projectName)
+ {
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// Retrieve a snapshot of the current status of the server.
+ ///
+ ///
+ public CruiseServerSnapshot GetCruiseServerSnapshot()
+ {
+ var client = _extension.OpenClient();
+ try
+ {
+ var snapshot = client.RetrieveSnapshot();
+ return WcfHelpers.ConvertSnapshotFromWcf(snapshot);
+ }
+ finally
+ {
+ _extension.CloseClient(client);
+ }
+ }
+ }
+}
Index: core/configuration/ServerConfigurationHandler.cs
===================================================================
--- core/configuration/ServerConfigurationHandler.cs (revision 0)
+++ core/configuration/ServerConfigurationHandler.cs (revision 0)
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Xml;
+using ThoughtWorks.CruiseControl.Remote;
+
+namespace ThoughtWorks.CruiseControl.Core.Config
+{
+ ///
+ /// Provides additional configuration settings for the server.
+ ///
+ ///
+ /// Currently this only retrieves a list of type names, but it could be extended in future
+ /// to load additional settings (perhaps in the same way as the custom builders work).
+ ///
+ public sealed class ServerConfigurationHandler
+ : IConfigurationSectionHandler
+ {
+ #region Create()
+ ///
+ /// Retrieve the list of extensions to load.
+ ///
+ /// The parent.
+ /// The context.
+ /// The section that is being loaded.
+ /// An array of strings containing the type names.
+ public object Create(object parent, object configContext, XmlNode section)
+ {
+ List extensions = new List();
+
+ foreach (XmlNode node in section.SelectNodes("extension"))
+ {
+ ExtensionConfiguration config = new ExtensionConfiguration();
+ config.Type = node.Attributes["type"].Value;
+ extensions.Add(config);
+ }
+
+ return extensions;
+ }
+ #endregion
+ }
+}
Index: Remote/ExtensionConfiguration.cs
==================================================