/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18444
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using org.uddi.apiv3;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

// 
// This source code was auto-generated by wsdl, Version=4.0.30319.17929.
// 

namespace org.apache.juddi.apiv3
{
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name = "JUDDIApiServiceSoapBinding", Namespace = "urn:juddi-apache-org:v3_service")]
    public partial class JUDDIApiService : System.Web.Services.Protocols.SoapHttpClientProtocol
    {

        private System.Threading.SendOrPostCallback get_publisherDetailOperationCompleted;

        private System.Threading.SendOrPostCallback delete_ClientSubscriptionInfoOperationCompleted;

        private System.Threading.SendOrPostCallback save_ClerkOperationCompleted;

     //   private System.Threading.SendOrPostCallback get_allPublisherDetailOperationCompleted;

        private System.Threading.SendOrPostCallback delete_publisherOperationCompleted;

        private System.Threading.SendOrPostCallback save_publisherOperationCompleted;

        private System.Threading.SendOrPostCallback save_NodeOperationCompleted;

        private System.Threading.SendOrPostCallback adminDelete_tModelOperationCompleted;

        private System.Threading.SendOrPostCallback save_ClientSubscriptionInfoOperationCompleted;

        private System.Threading.SendOrPostCallback invoke_SyncSubscriptionOperationCompleted;

        private System.Threading.SendOrPostCallback get_AllNodesOperationCompleted;

        private System.Threading.SendOrPostCallback get_AllClerksOperationCompleted;

        private System.Threading.SendOrPostCallback delete_NodeOperationCompleted;

        private System.Threading.SendOrPostCallback delete_ClerkOperationCompleted;

        private System.Threading.SendOrPostCallback adminSave_BusinessOperationCompleted;

        private System.Threading.SendOrPostCallback adminSave_tModelOperationCompleted;

        private System.Threading.SendOrPostCallback get_ReplicationNodesOperationCompleted;

        private System.Threading.SendOrPostCallback set_ReplicationNodesOperationCompleted;

        private System.Threading.SendOrPostCallback get_allClientSubscriptionInfoOperationCompleted;

        private System.Threading.SendOrPostCallback adminDelete_SubscriptionOperationCompleted;

        private System.Threading.SendOrPostCallback adminSave_SubscriptionOperationCompleted;

        /// <remarks/>
        public JUDDIApiService()
        {
            this.Url = "http://localhost/juddiv3/services/juddi-api";
        }

        /// <remarks/>
        public event get_publisherDetailCompletedEventHandler get_publisherDetailCompleted;

        /// <remarks/>
        public event delete_ClientSubscriptionInfoCompletedEventHandler delete_ClientSubscriptionInfoCompleted;

        /// <remarks/>
        public event save_ClerkCompletedEventHandler save_ClerkCompleted;

        /// <remarks/>
  //      public event get_allPublisherDetailCompletedEventHandler get_allPublisherDetailCompleted;

        /// <remarks/>
        public event delete_publisherCompletedEventHandler delete_publisherCompleted;

        /// <remarks/>
        public event save_publisherCompletedEventHandler save_publisherCompleted;

        /// <remarks/>
        public event save_NodeCompletedEventHandler save_NodeCompleted;

        /// <remarks/>
        public event adminDelete_tModelCompletedEventHandler adminDelete_tModelCompleted;

        /// <remarks/>
        public event save_ClientSubscriptionInfoCompletedEventHandler save_ClientSubscriptionInfoCompleted;

        /// <remarks/>
        public event invoke_SyncSubscriptionCompletedEventHandler invoke_SyncSubscriptionCompleted;

        /// <remarks/>
        public event get_AllNodesCompletedEventHandler get_AllNodesCompleted;

        /// <remarks/>
        public event get_AllClerksCompletedEventHandler get_AllClerksCompleted;

        /// <remarks/>
        public event delete_NodeCompletedEventHandler delete_NodeCompleted;

        /// <remarks/>
        public event delete_ClerkCompletedEventHandler delete_ClerkCompleted;

        /// <remarks/>
        public event adminSave_BusinessCompletedEventHandler adminSave_BusinessCompleted;

        /// <remarks/>
        public event adminSave_tModelCompletedEventHandler adminSave_tModelCompleted;

        /// <remarks/>
        public event get_ReplicationNodesCompletedEventHandler get_ReplicationNodesCompleted;

        /// <remarks/>
        public event set_ReplicationNodesCompletedEventHandler set_ReplicationNodesCompleted;

        /// <remarks/>
        public event get_allClientSubscriptionInfoCompletedEventHandler get_allClientSubscriptionInfoCompleted;

        /// <remarks/>
        public event adminDelete_SubscriptionCompletedEventHandler adminDelete_SubscriptionCompleted;

        /// <remarks/>
        public event adminSave_SubscriptionCompletedEventHandler adminSave_SubscriptionCompleted;

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_publisherDetail", RequestNamespace = "urn:juddi-apache-org:api_v3", ResponseElementName = "publisherDetail", ResponseNamespace = "urn:juddi-apache-org:api_v3", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("publisher", IsNullable = true)]
        public publisher[] get_publisherDetail(string authInfo, [System.Xml.Serialization.XmlElementAttribute("publisherId")] string[] publisherId, [System.Xml.Serialization.XmlAttributeAttribute()] out bool truncated, [System.Xml.Serialization.XmlAttributeAttribute()] [System.Xml.Serialization.XmlIgnoreAttribute()] out bool truncatedSpecified)
        {
            object[] results = this.Invoke("get_publisherDetail", new object[] {
                    authInfo,
                    publisherId});
            truncated = ((bool)(results[1]));
            truncatedSpecified = ((bool)(results[2]));
            return ((publisher[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_publisherDetail(string authInfo, string[] publisherId, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_publisherDetail", new object[] {
                    authInfo,
                    publisherId}, callback, asyncState);
        }

        /// <remarks/>
        public publisher[] Endget_publisherDetail(System.IAsyncResult asyncResult, out bool truncated, out bool truncatedSpecified)
        {
            object[] results = this.EndInvoke(asyncResult);
            truncated = ((bool)(results[1]));
            truncatedSpecified = ((bool)(results[2]));
            return ((publisher[])(results[0]));
        }

        /// <remarks/>
        public void get_publisherDetailAsync(string authInfo, string[] publisherId)
        {
            this.get_publisherDetailAsync(authInfo, publisherId, null);
        }

        /// <remarks/>
        public void get_publisherDetailAsync(string authInfo, string[] publisherId, object userState)
        {
            if ((this.get_publisherDetailOperationCompleted == null))
            {
                this.get_publisherDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_publisherDetailOperationCompleted);
            }
            this.InvokeAsync("get_publisherDetail", new object[] {
                    authInfo,
                    publisherId}, this.get_publisherDetailOperationCompleted, userState);
        }

        private void Onget_publisherDetailOperationCompleted(object arg)
        {
            if ((this.get_publisherDetailCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_publisherDetailCompleted(this, new get_publisherDetailCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_ClientSubscriptionInfo", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public void delete_ClientSubscriptionInfo([System.Xml.Serialization.XmlElementAttribute("delete_ClientSubscriptionInfo", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] delete_clientSubscriptionInfo delete_ClientSubscriptionInfo1)
        {
            this.Invoke("delete_ClientSubscriptionInfo", new object[] {
                    delete_ClientSubscriptionInfo1});
        }

        /// <remarks/>
        public System.IAsyncResult Begindelete_ClientSubscriptionInfo(delete_clientSubscriptionInfo delete_ClientSubscriptionInfo1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("delete_ClientSubscriptionInfo", new object[] {
                    delete_ClientSubscriptionInfo1}, callback, asyncState);
        }

        /// <remarks/>
        public void Enddelete_ClientSubscriptionInfo(System.IAsyncResult asyncResult)
        {
            this.EndInvoke(asyncResult);
        }

        /// <remarks/>
        public void delete_ClientSubscriptionInfoAsync(delete_clientSubscriptionInfo delete_ClientSubscriptionInfo1)
        {
            this.delete_ClientSubscriptionInfoAsync(delete_ClientSubscriptionInfo1, null);
        }

        /// <remarks/>
        public void delete_ClientSubscriptionInfoAsync(delete_clientSubscriptionInfo delete_ClientSubscriptionInfo1, object userState)
        {
            if ((this.delete_ClientSubscriptionInfoOperationCompleted == null))
            {
                this.delete_ClientSubscriptionInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_ClientSubscriptionInfoOperationCompleted);
            }
            this.InvokeAsync("delete_ClientSubscriptionInfo", new object[] {
                    delete_ClientSubscriptionInfo1}, this.delete_ClientSubscriptionInfoOperationCompleted, userState);
        }

        private void Ondelete_ClientSubscriptionInfoOperationCompleted(object arg)
        {
            if ((this.delete_ClientSubscriptionInfoCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.delete_ClientSubscriptionInfoCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_Clerk", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlArrayAttribute("save_ClerkResponse", Namespace = "urn:juddi-apache-org:v3_service", IsNullable = true)]
        [return: System.Xml.Serialization.XmlArrayItemAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
        public clerk[] save_Clerk([System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:juddi-apache-org:api_v3")] save_clerk save_ClerkRequest)
        {
            object[] results = this.Invoke("save_Clerk", new object[] {
                    save_ClerkRequest});
            return ((clerk[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginsave_Clerk(save_clerk save_ClerkRequest, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("save_Clerk", new object[] {
                    save_ClerkRequest}, callback, asyncState);
        }

        /// <remarks/>
        public clerk[] Endsave_Clerk(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((clerk[])(results[0]));
        }

        /// <remarks/>
        public void save_ClerkAsync(save_clerk save_ClerkRequest)
        {
            this.save_ClerkAsync(save_ClerkRequest, null);
        }

        /// <remarks/>
        public void save_ClerkAsync(save_clerk save_ClerkRequest, object userState)
        {
            if ((this.save_ClerkOperationCompleted == null))
            {
                this.save_ClerkOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_ClerkOperationCompleted);
            }
            this.InvokeAsync("save_Clerk", new object[] {
                    save_ClerkRequest}, this.save_ClerkOperationCompleted, userState);
        }

        private void Onsave_ClerkOperationCompleted(object arg)
        {
            if ((this.save_ClerkCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.save_ClerkCompleted(this, new save_ClerkCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }
/*
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_allPublisherDetail", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("publisherDetail", Namespace = "urn:juddi-apache-org:api_v3")]
        public object[] get_allPublisherDetail([System.Xml.Serialization.XmlElementAttribute("get_allPublisherDetail", Namespace = "urn:juddi-apache-org:api_v3")] get_allPublisherDetail get_allPublisherDetail1)
        {
            object[] results = this.Invoke("get_allPublisherDetail", new object[] {
                    get_allPublisherDetail1});
            return ((object[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_allPublisherDetail(get_allPublisherDetail get_allPublisherDetail1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_allPublisherDetail", new object[] {
                    get_allPublisherDetail1}, callback, asyncState);
        }

        /// <remarks/>
        public object[] Endget_allPublisherDetail(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((object[])(results[0]));
        }

        /// <remarks/>
        public void get_allPublisherDetailAsync(get_allPublisherDetail get_allPublisherDetail1)
        {
            this.get_allPublisherDetailAsync(get_allPublisherDetail1, null);
        }

        /// <remarks/>
        public void get_allPublisherDetailAsync(get_allPublisherDetail get_allPublisherDetail1, object userState)
        {
            if ((this.get_allPublisherDetailOperationCompleted == null))
            {
                this.get_allPublisherDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_allPublisherDetailOperationCompleted);
            }
            this.InvokeAsync("get_allPublisherDetail", new object[] {
                    get_allPublisherDetail1}, this.get_allPublisherDetailOperationCompleted, userState);
        }

        private void Onget_allPublisherDetailOperationCompleted(object arg)
        {
            if ((this.get_allPublisherDetailCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_allPublisherDetailCompleted(this, new get_allPublisherDetailCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }*/

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_publisher", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public void delete_publisher([System.Xml.Serialization.XmlElementAttribute("delete_publisher", Namespace = "urn:juddi-apache-org:api_v3")] delete_publisher delete_publisher1)
        {
            this.Invoke("delete_publisher", new object[] {
                    delete_publisher1});
        }

        /// <remarks/>
        public System.IAsyncResult Begindelete_publisher(delete_publisher delete_publisher1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("delete_publisher", new object[] {
                    delete_publisher1}, callback, asyncState);
        }

        /// <remarks/>
        public void Enddelete_publisher(System.IAsyncResult asyncResult)
        {
            this.EndInvoke(asyncResult);
        }

        /// <remarks/>
        public void delete_publisherAsync(delete_publisher delete_publisher1)
        {
            this.delete_publisherAsync(delete_publisher1, null);
        }

        /// <remarks/>
        public void delete_publisherAsync(delete_publisher delete_publisher1, object userState)
        {
            if ((this.delete_publisherOperationCompleted == null))
            {
                this.delete_publisherOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_publisherOperationCompleted);
            }
            this.InvokeAsync("delete_publisher", new object[] {
                    delete_publisher1}, this.delete_publisherOperationCompleted, userState);
        }

        private void Ondelete_publisherOperationCompleted(object arg)
        {
            if ((this.delete_publisherCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.delete_publisherCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_publisher", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("save_publisherResponse", Namespace = "urn:juddi-apache-org:v3_service", IsNullable = true)]
        public publisherDetail save_publisher([System.Xml.Serialization.XmlElementAttribute("save_publisher", Namespace = "urn:juddi-apache-org:api_v3")] save_publisher save_publisher1)
        {
            object[] results = this.Invoke("save_publisher", new object[] {
                    save_publisher1});
            return ((publisherDetail)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginsave_publisher(save_publisher save_publisher1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("save_publisher", new object[] {
                    save_publisher1}, callback, asyncState);
        }

        /// <remarks/>
        public publisherDetail Endsave_publisher(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((publisherDetail)(results[0]));
        }

        /// <remarks/>
        public void save_publisherAsync(save_publisher save_publisher1)
        {
            this.save_publisherAsync(save_publisher1, null);
        }

        /// <remarks/>
        public void save_publisherAsync(save_publisher save_publisher1, object userState)
        {
            if ((this.save_publisherOperationCompleted == null))
            {
                this.save_publisherOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_publisherOperationCompleted);
            }
            this.InvokeAsync("save_publisher", new object[] {
                    save_publisher1}, this.save_publisherOperationCompleted, userState);
        }

        private void Onsave_publisherOperationCompleted(object arg)
        {
            if ((this.save_publisherCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.save_publisherCompleted(this, new save_publisherCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_Node", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlArrayAttribute("save_NodeResponse", Namespace = "urn:juddi-apache-org:v3_service", IsNullable = true)]
        [return: System.Xml.Serialization.XmlArrayItemAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
        public node[] save_Node([System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:juddi-apache-org:api_v3")] save_node save_NodeRequest)
        {
            object[] results = this.Invoke("save_Node", new object[] {
                    save_NodeRequest});
            return ((node[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginsave_Node(save_node save_NodeRequest, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("save_Node", new object[] {
                    save_NodeRequest}, callback, asyncState);
        }

        /// <remarks/>
        public node[] Endsave_Node(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((node[])(results[0]));
        }

        /// <remarks/>
        public void save_NodeAsync(save_node save_NodeRequest)
        {
            this.save_NodeAsync(save_NodeRequest, null);
        }

        /// <remarks/>
        public void save_NodeAsync(save_node save_NodeRequest, object userState)
        {
            if ((this.save_NodeOperationCompleted == null))
            {
                this.save_NodeOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_NodeOperationCompleted);
            }
            this.InvokeAsync("save_Node", new object[] {
                    save_NodeRequest}, this.save_NodeOperationCompleted, userState);
        }

        private void Onsave_NodeOperationCompleted(object arg)
        {
            if ((this.save_NodeCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.save_NodeCompleted(this, new save_NodeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("adminDelete_tmodel", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public void adminDelete_tModel([System.Xml.Serialization.XmlElementAttribute("adminDelete_tmodel", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] delete_tModel adminDelete_tmodel1)
        {
            this.Invoke("adminDelete_tModel", new object[] {
                    adminDelete_tmodel1});
        }

        /// <remarks/>
        public System.IAsyncResult BeginadminDelete_tModel(delete_tModel adminDelete_tmodel1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("adminDelete_tModel", new object[] {
                    adminDelete_tmodel1}, callback, asyncState);
        }

        /// <remarks/>
        public void EndadminDelete_tModel(System.IAsyncResult asyncResult)
        {
            this.EndInvoke(asyncResult);
        }

        /// <remarks/>
        public void adminDelete_tModelAsync(delete_tModel adminDelete_tmodel1)
        {
            this.adminDelete_tModelAsync(adminDelete_tmodel1, null);
        }

        /// <remarks/>
        public void adminDelete_tModelAsync(delete_tModel adminDelete_tmodel1, object userState)
        {
            if ((this.adminDelete_tModelOperationCompleted == null))
            {
                this.adminDelete_tModelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnadminDelete_tModelOperationCompleted);
            }
            this.InvokeAsync("adminDelete_tModel", new object[] {
                    adminDelete_tmodel1}, this.adminDelete_tModelOperationCompleted, userState);
        }

        private void OnadminDelete_tModelOperationCompleted(object arg)
        {
            if ((this.adminDelete_tModelCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.adminDelete_tModelCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_ClientSubscriptionInfo", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlArrayAttribute("save_ClientSubscriptionInfoResponse", Namespace = "urn:juddi-apache-org:v3_service", IsNullable = true)]
        [return: System.Xml.Serialization.XmlArrayItemAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
        public clientSubscriptionInfo[] save_ClientSubscriptionInfo([System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] save_clientSubscriptionInfo save_ClientSubscriptionInfoRequest)
        {
            object[] results = this.Invoke("save_ClientSubscriptionInfo", new object[] {
                    save_ClientSubscriptionInfoRequest});
            return ((clientSubscriptionInfo[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginsave_ClientSubscriptionInfo(save_clientSubscriptionInfo save_ClientSubscriptionInfoRequest, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("save_ClientSubscriptionInfo", new object[] {
                    save_ClientSubscriptionInfoRequest}, callback, asyncState);
        }

        /// <remarks/>
        public clientSubscriptionInfo[] Endsave_ClientSubscriptionInfo(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((clientSubscriptionInfo[])(results[0]));
        }

        /// <remarks/>
        public void save_ClientSubscriptionInfoAsync(save_clientSubscriptionInfo save_ClientSubscriptionInfoRequest)
        {
            this.save_ClientSubscriptionInfoAsync(save_ClientSubscriptionInfoRequest, null);
        }

        /// <remarks/>
        public void save_ClientSubscriptionInfoAsync(save_clientSubscriptionInfo save_ClientSubscriptionInfoRequest, object userState)
        {
            if ((this.save_ClientSubscriptionInfoOperationCompleted == null))
            {
                this.save_ClientSubscriptionInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_ClientSubscriptionInfoOperationCompleted);
            }
            this.InvokeAsync("save_ClientSubscriptionInfo", new object[] {
                    save_ClientSubscriptionInfoRequest}, this.save_ClientSubscriptionInfoOperationCompleted, userState);
        }

        private void Onsave_ClientSubscriptionInfoOperationCompleted(object arg)
        {
            if ((this.save_ClientSubscriptionInfoCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.save_ClientSubscriptionInfoCompleted(this, new save_ClientSubscriptionInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("invoke_SyncSubscription", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("invoke_SyncSubscriptionResponse", Namespace = "urn:juddi-apache-org:v3_service", IsNullable = true)]
        public syncSubscriptionDetailResponse invoke_SyncSubscription([System.Xml.Serialization.XmlElementAttribute("invoke_SyncSubscription", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] syncSubscriptionRequest invoke_SyncSubscription1)
        {
            object[] results = this.Invoke("invoke_SyncSubscription", new object[] {
                    invoke_SyncSubscription1});
            return ((syncSubscriptionDetailResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Begininvoke_SyncSubscription(syncSubscriptionRequest invoke_SyncSubscription1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("invoke_SyncSubscription", new object[] {
                    invoke_SyncSubscription1}, callback, asyncState);
        }

        /// <remarks/>
        public syncSubscriptionDetailResponse Endinvoke_SyncSubscription(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((syncSubscriptionDetailResponse)(results[0]));
        }

        /// <remarks/>
        public void invoke_SyncSubscriptionAsync(syncSubscriptionRequest invoke_SyncSubscription1)
        {
            this.invoke_SyncSubscriptionAsync(invoke_SyncSubscription1, null);
        }

        /// <remarks/>
        public void invoke_SyncSubscriptionAsync(syncSubscriptionRequest invoke_SyncSubscription1, object userState)
        {
            if ((this.invoke_SyncSubscriptionOperationCompleted == null))
            {
                this.invoke_SyncSubscriptionOperationCompleted = new System.Threading.SendOrPostCallback(this.Oninvoke_SyncSubscriptionOperationCompleted);
            }
            this.InvokeAsync("invoke_SyncSubscription", new object[] {
                    invoke_SyncSubscription1}, this.invoke_SyncSubscriptionOperationCompleted, userState);
        }

        private void Oninvoke_SyncSubscriptionOperationCompleted(object arg)
        {
            if ((this.invoke_SyncSubscriptionCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.invoke_SyncSubscriptionCompleted(this, new invoke_SyncSubscriptionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_AllNodes", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("get_AllNodesResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public get_AllNodesResponse get_AllNodes([System.Xml.Serialization.XmlElementAttribute("get_AllNodes", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] get_AllNodes get_AllNodes1)
        {
            object[] results = this.Invoke("get_AllNodes", new object[] {
                    get_AllNodes1});
            return ((get_AllNodesResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_AllNodes(get_AllNodes get_AllNodes1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_AllNodes", new object[] {
                    get_AllNodes1}, callback, asyncState);
        }

        /// <remarks/>
        public get_AllNodesResponse Endget_AllNodes(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((get_AllNodesResponse)(results[0]));
        }

        /// <remarks/>
        public void get_AllNodesAsync(get_AllNodes get_AllNodes1)
        {
            this.get_AllNodesAsync(get_AllNodes1, null);
        }

        /// <remarks/>
        public void get_AllNodesAsync(get_AllNodes get_AllNodes1, object userState)
        {
            if ((this.get_AllNodesOperationCompleted == null))
            {
                this.get_AllNodesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_AllNodesOperationCompleted);
            }
            this.InvokeAsync("get_AllNodes", new object[] {
                    get_AllNodes1}, this.get_AllNodesOperationCompleted, userState);
        }

        private void Onget_AllNodesOperationCompleted(object arg)
        {
            if ((this.get_AllNodesCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_AllNodesCompleted(this, new get_AllNodesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_AllClerks", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("get_AllClerksResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public get_AllClerksResponse get_AllClerks([System.Xml.Serialization.XmlElementAttribute("get_AllClerks", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] get_AllClerks get_AllClerks1)
        {
            object[] results = this.Invoke("get_AllClerks", new object[] {
                    get_AllClerks1});
            return ((get_AllClerksResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_AllClerks(get_AllClerks get_AllClerks1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_AllClerks", new object[] {
                    get_AllClerks1}, callback, asyncState);
        }

        /// <remarks/>
        public get_AllClerksResponse Endget_AllClerks(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((get_AllClerksResponse)(results[0]));
        }

        /// <remarks/>
        public void get_AllClerksAsync(get_AllClerks get_AllClerks1)
        {
            this.get_AllClerksAsync(get_AllClerks1, null);
        }

        /// <remarks/>
        public void get_AllClerksAsync(get_AllClerks get_AllClerks1, object userState)
        {
            if ((this.get_AllClerksOperationCompleted == null))
            {
                this.get_AllClerksOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_AllClerksOperationCompleted);
            }
            this.InvokeAsync("get_AllClerks", new object[] {
                    get_AllClerks1}, this.get_AllClerksOperationCompleted, userState);
        }

        private void Onget_AllClerksOperationCompleted(object arg)
        {
            if ((this.get_AllClerksCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_AllClerksCompleted(this, new get_AllClerksCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_Node", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public void delete_Node([System.Xml.Serialization.XmlElementAttribute("delete_Node", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] delete_Node delete_Node1)
        {
            this.Invoke("delete_Node", new object[] {
                    delete_Node1});
        }

        /// <remarks/>
        public System.IAsyncResult Begindelete_Node(delete_Node delete_Node1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("delete_Node", new object[] {
                    delete_Node1}, callback, asyncState);
        }

        /// <remarks/>
        public void Enddelete_Node(System.IAsyncResult asyncResult)
        {
            this.EndInvoke(asyncResult);
        }

        /// <remarks/>
        public void delete_NodeAsync(delete_Node delete_Node1)
        {
            this.delete_NodeAsync(delete_Node1, null);
        }

        /// <remarks/>
        public void delete_NodeAsync(delete_Node delete_Node1, object userState)
        {
            if ((this.delete_NodeOperationCompleted == null))
            {
                this.delete_NodeOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_NodeOperationCompleted);
            }
            this.InvokeAsync("delete_Node", new object[] {
                    delete_Node1}, this.delete_NodeOperationCompleted, userState);
        }

        private void Ondelete_NodeOperationCompleted(object arg)
        {
            if ((this.delete_NodeCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.delete_NodeCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_Clerk", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public void delete_Clerk([System.Xml.Serialization.XmlElementAttribute("delete_Clerk", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] delete_Clerk delete_Clerk1)
        {
            this.Invoke("delete_Clerk", new object[] {
                    delete_Clerk1});
        }

        /// <remarks/>
        public System.IAsyncResult Begindelete_Clerk(delete_Clerk delete_Clerk1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("delete_Clerk", new object[] {
                    delete_Clerk1}, callback, asyncState);
        }

        /// <remarks/>
        public void Enddelete_Clerk(System.IAsyncResult asyncResult)
        {
            this.EndInvoke(asyncResult);
        }

        /// <remarks/>
        public void delete_ClerkAsync(delete_Clerk delete_Clerk1)
        {
            this.delete_ClerkAsync(delete_Clerk1, null);
        }

        /// <remarks/>
        public void delete_ClerkAsync(delete_Clerk delete_Clerk1, object userState)
        {
            if ((this.delete_ClerkOperationCompleted == null))
            {
                this.delete_ClerkOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_ClerkOperationCompleted);
            }
            this.InvokeAsync("delete_Clerk", new object[] {
                    delete_Clerk1}, this.delete_ClerkOperationCompleted, userState);
        }

        private void Ondelete_ClerkOperationCompleted(object arg)
        {
            if ((this.delete_ClerkCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.delete_ClerkCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("adminSave_Business", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("adminSave_BusinessResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public adminSave_BusinessResponse adminSave_Business([System.Xml.Serialization.XmlElementAttribute("adminSave_Business", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] adminSave_Business adminSave_Business1)
        {
            object[] results = this.Invoke("adminSave_Business", new object[] {
                    adminSave_Business1});
            return ((adminSave_BusinessResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult BeginadminSave_Business(adminSave_Business adminSave_Business1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("adminSave_Business", new object[] {
                    adminSave_Business1}, callback, asyncState);
        }

        /// <remarks/>
        public adminSave_BusinessResponse EndadminSave_Business(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((adminSave_BusinessResponse)(results[0]));
        }

        /// <remarks/>
        public void adminSave_BusinessAsync(adminSave_Business adminSave_Business1)
        {
            this.adminSave_BusinessAsync(adminSave_Business1, null);
        }

        /// <remarks/>
        public void adminSave_BusinessAsync(adminSave_Business adminSave_Business1, object userState)
        {
            if ((this.adminSave_BusinessOperationCompleted == null))
            {
                this.adminSave_BusinessOperationCompleted = new System.Threading.SendOrPostCallback(this.OnadminSave_BusinessOperationCompleted);
            }
            this.InvokeAsync("adminSave_Business", new object[] {
                    adminSave_Business1}, this.adminSave_BusinessOperationCompleted, userState);
        }

        private void OnadminSave_BusinessOperationCompleted(object arg)
        {
            if ((this.adminSave_BusinessCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.adminSave_BusinessCompleted(this, new adminSave_BusinessCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("adminSave_tModel", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("adminSave_tModelResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public adminSave_tModelResponse adminSave_tModel([System.Xml.Serialization.XmlElementAttribute("adminSave_tModel", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] adminSave_tModel adminSave_tModel1)
        {
            object[] results = this.Invoke("adminSave_tModel", new object[] {
                    adminSave_tModel1});
            return ((adminSave_tModelResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult BeginadminSave_tModel(adminSave_tModel adminSave_tModel1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("adminSave_tModel", new object[] {
                    adminSave_tModel1}, callback, asyncState);
        }

        /// <remarks/>
        public adminSave_tModelResponse EndadminSave_tModel(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((adminSave_tModelResponse)(results[0]));
        }

        /// <remarks/>
        public void adminSave_tModelAsync(adminSave_tModel adminSave_tModel1)
        {
            this.adminSave_tModelAsync(adminSave_tModel1, null);
        }

        /// <remarks/>
        public void adminSave_tModelAsync(adminSave_tModel adminSave_tModel1, object userState)
        {
            if ((this.adminSave_tModelOperationCompleted == null))
            {
                this.adminSave_tModelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnadminSave_tModelOperationCompleted);
            }
            this.InvokeAsync("adminSave_tModel", new object[] {
                    adminSave_tModel1}, this.adminSave_tModelOperationCompleted, userState);
        }

        private void OnadminSave_tModelOperationCompleted(object arg)
        {
            if ((this.adminSave_tModelCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.adminSave_tModelCompleted(this, new adminSave_tModelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_ReplicationNodes", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("get_ReplicationNodesResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public get_ReplicationNodesResponse get_ReplicationNodes([System.Xml.Serialization.XmlElementAttribute("get_ReplicationNodes", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] get_ReplicationNodes get_ReplicationNodes1)
        {
            object[] results = this.Invoke("get_ReplicationNodes", new object[] {
                    get_ReplicationNodes1});
            return ((get_ReplicationNodesResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_ReplicationNodes(get_ReplicationNodes get_ReplicationNodes1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_ReplicationNodes", new object[] {
                    get_ReplicationNodes1}, callback, asyncState);
        }

        /// <remarks/>
        public get_ReplicationNodesResponse Endget_ReplicationNodes(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((get_ReplicationNodesResponse)(results[0]));
        }

        /// <remarks/>
        public void get_ReplicationNodesAsync(get_ReplicationNodes get_ReplicationNodes1)
        {
            this.get_ReplicationNodesAsync(get_ReplicationNodes1, null);
        }

        /// <remarks/>
        public void get_ReplicationNodesAsync(get_ReplicationNodes get_ReplicationNodes1, object userState)
        {
            if ((this.get_ReplicationNodesOperationCompleted == null))
            {
                this.get_ReplicationNodesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_ReplicationNodesOperationCompleted);
            }
            this.InvokeAsync("get_ReplicationNodes", new object[] {
                    get_ReplicationNodes1}, this.get_ReplicationNodesOperationCompleted, userState);
        }

        private void Onget_ReplicationNodesOperationCompleted(object arg)
        {
            if ((this.get_ReplicationNodesCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_ReplicationNodesCompleted(this, new get_ReplicationNodesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("set_ReplicationNodes", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("set_ReplicationNodesResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public set_ReplicationNodesResponse set_ReplicationNodes([System.Xml.Serialization.XmlElementAttribute("set_ReplicationNodes", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] set_ReplicationNodes set_ReplicationNodes1)
        {
            object[] results = this.Invoke("set_ReplicationNodes", new object[] {
                    set_ReplicationNodes1});
            return ((set_ReplicationNodesResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginset_ReplicationNodes(set_ReplicationNodes set_ReplicationNodes1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("set_ReplicationNodes", new object[] {
                    set_ReplicationNodes1}, callback, asyncState);
        }

        /// <remarks/>
        public set_ReplicationNodesResponse Endset_ReplicationNodes(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((set_ReplicationNodesResponse)(results[0]));
        }

        /// <remarks/>
        public void set_ReplicationNodesAsync(set_ReplicationNodes set_ReplicationNodes1)
        {
            this.set_ReplicationNodesAsync(set_ReplicationNodes1, null);
        }

        /// <remarks/>
        public void set_ReplicationNodesAsync(set_ReplicationNodes set_ReplicationNodes1, object userState)
        {
            if ((this.set_ReplicationNodesOperationCompleted == null))
            {
                this.set_ReplicationNodesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onset_ReplicationNodesOperationCompleted);
            }
            this.InvokeAsync("set_ReplicationNodes", new object[] {
                    set_ReplicationNodes1}, this.set_ReplicationNodesOperationCompleted, userState);
        }

        private void Onset_ReplicationNodesOperationCompleted(object arg)
        {
            if ((this.set_ReplicationNodesCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.set_ReplicationNodesCompleted(this, new set_ReplicationNodesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_allClientSubscriptionInfo", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlArrayAttribute("get_allClientSubscriptionInfoResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        [return: System.Xml.Serialization.XmlArrayItemAttribute("subscriptions", IsNullable = false)]
        public subscriptionWrapper[] get_allClientSubscriptionInfo([System.Xml.Serialization.XmlElementAttribute("get_allClientSubscriptionInfo", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] get_allClientSubscriptionInfo get_allClientSubscriptionInfo1)
        {
            object[] results = this.Invoke("get_allClientSubscriptionInfo", new object[] {
                    get_allClientSubscriptionInfo1});
            return ((subscriptionWrapper[])(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult Beginget_allClientSubscriptionInfo(get_allClientSubscriptionInfo get_allClientSubscriptionInfo1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("get_allClientSubscriptionInfo", new object[] {
                    get_allClientSubscriptionInfo1}, callback, asyncState);
        }

        /// <remarks/>
        public subscriptionWrapper[] Endget_allClientSubscriptionInfo(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((subscriptionWrapper[])(results[0]));
        }

        /// <remarks/>
        public void get_allClientSubscriptionInfoAsync(get_allClientSubscriptionInfo get_allClientSubscriptionInfo1)
        {
            this.get_allClientSubscriptionInfoAsync(get_allClientSubscriptionInfo1, null);
        }

        /// <remarks/>
        public void get_allClientSubscriptionInfoAsync(get_allClientSubscriptionInfo get_allClientSubscriptionInfo1, object userState)
        {
            if ((this.get_allClientSubscriptionInfoOperationCompleted == null))
            {
                this.get_allClientSubscriptionInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_allClientSubscriptionInfoOperationCompleted);
            }
            this.InvokeAsync("get_allClientSubscriptionInfo", new object[] {
                    get_allClientSubscriptionInfo1}, this.get_allClientSubscriptionInfoOperationCompleted, userState);
        }

        private void Onget_allClientSubscriptionInfoOperationCompleted(object arg)
        {
            if ((this.get_allClientSubscriptionInfoCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_allClientSubscriptionInfoCompleted(this, new get_allClientSubscriptionInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("adminDelete_Subscription", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("adminDelete_SubscriptionResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public adminDelete_SubscriptionResponse adminDelete_Subscription([System.Xml.Serialization.XmlElementAttribute("adminDelete_Subscription", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] adminDelete_SubscriptionRequest adminDelete_Subscription1)
        {
            object[] results = this.Invoke("adminDelete_Subscription", new object[] {
                    adminDelete_Subscription1});
            return ((adminDelete_SubscriptionResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult BeginadminDelete_Subscription(adminDelete_SubscriptionRequest adminDelete_Subscription1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("adminDelete_Subscription", new object[] {
                    adminDelete_Subscription1}, callback, asyncState);
        }

        /// <remarks/>
        public adminDelete_SubscriptionResponse EndadminDelete_Subscription(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((adminDelete_SubscriptionResponse)(results[0]));
        }

        /// <remarks/>
        public void adminDelete_SubscriptionAsync(adminDelete_SubscriptionRequest adminDelete_Subscription1)
        {
            this.adminDelete_SubscriptionAsync(adminDelete_Subscription1, null);
        }

        /// <remarks/>
        public void adminDelete_SubscriptionAsync(adminDelete_SubscriptionRequest adminDelete_Subscription1, object userState)
        {
            if ((this.adminDelete_SubscriptionOperationCompleted == null))
            {
                this.adminDelete_SubscriptionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnadminDelete_SubscriptionOperationCompleted);
            }
            this.InvokeAsync("adminDelete_Subscription", new object[] {
                    adminDelete_Subscription1}, this.adminDelete_SubscriptionOperationCompleted, userState);
        }

        private void OnadminDelete_SubscriptionOperationCompleted(object arg)
        {
            if ((this.adminDelete_SubscriptionCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.adminDelete_SubscriptionCompleted(this, new adminDelete_SubscriptionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("adminSave_Subscription", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("adminSave_SubscriptionResponse", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)]
        public adminSave_SubscriptionResponse adminSave_Subscription([System.Xml.Serialization.XmlElementAttribute("adminSave_Subscription", Namespace = "urn:juddi-apache-org:api_v3", IsNullable = true)] adminSave_SubscriptionRequest adminSave_Subscription1)
        {
            object[] results = this.Invoke("adminSave_Subscription", new object[] {
                    adminSave_Subscription1});
            return ((adminSave_SubscriptionResponse)(results[0]));
        }

        /// <remarks/>
        public System.IAsyncResult BeginadminSave_Subscription(adminSave_SubscriptionRequest adminSave_Subscription1, System.AsyncCallback callback, object asyncState)
        {
            return this.BeginInvoke("adminSave_Subscription", new object[] {
                    adminSave_Subscription1}, callback, asyncState);
        }

        /// <remarks/>
        public adminSave_SubscriptionResponse EndadminSave_Subscription(System.IAsyncResult asyncResult)
        {
            object[] results = this.EndInvoke(asyncResult);
            return ((adminSave_SubscriptionResponse)(results[0]));
        }

        /// <remarks/>
        public void adminSave_SubscriptionAsync(adminSave_SubscriptionRequest adminSave_Subscription1)
        {
            this.adminSave_SubscriptionAsync(adminSave_Subscription1, null);
        }

        /// <remarks/>
        public void adminSave_SubscriptionAsync(adminSave_SubscriptionRequest adminSave_Subscription1, object userState)
        {
            if ((this.adminSave_SubscriptionOperationCompleted == null))
            {
                this.adminSave_SubscriptionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnadminSave_SubscriptionOperationCompleted);
            }
            this.InvokeAsync("adminSave_Subscription", new object[] {
                    adminSave_Subscription1}, this.adminSave_SubscriptionOperationCompleted, userState);
        }

        private void OnadminSave_SubscriptionOperationCompleted(object arg)
        {
            if ((this.adminSave_SubscriptionCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.adminSave_SubscriptionCompleted(this, new adminSave_SubscriptionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }

        /// <remarks/>
        public new void CancelAsync(object userState)
        {
            base.CancelAsync(userState);
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class publisher
    {

        private string publisherNameField;

        private string emailAddressField;

        private bool isAdminField;

        private bool isAdminFieldSpecified;

        private bool isEnabledField;

        private bool isEnabledFieldSpecified;

        private int maxBindingsPerServiceField;

        private bool maxBindingsPerServiceFieldSpecified;

        private int maxBusinessesField;

        private bool maxBusinessesFieldSpecified;

        private int maxServicePerBusinessField;

        private bool maxServicePerBusinessFieldSpecified;

        private int maxTModelsField;

        private bool maxTModelsFieldSpecified;

        private SignatureType[] signatureField;

        private string authorizedNameField;

        /// <remarks/>
        public string publisherName
        {
            get
            {
                return this.publisherNameField;
            }
            set
            {
                this.publisherNameField = value;
            }
        }

        /// <remarks/>
        public string emailAddress
        {
            get
            {
                return this.emailAddressField;
            }
            set
            {
                this.emailAddressField = value;
            }
        }

        /// <remarks/>
        public bool isAdmin
        {
            get
            {
                return this.isAdminField;
            }
            set
            {
                this.isAdminField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool isAdminSpecified
        {
            get
            {
                return this.isAdminFieldSpecified;
            }
            set
            {
                this.isAdminFieldSpecified = value;
            }
        }

        /// <remarks/>
        public bool isEnabled
        {
            get
            {
                return this.isEnabledField;
            }
            set
            {
                this.isEnabledField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool isEnabledSpecified
        {
            get
            {
                return this.isEnabledFieldSpecified;
            }
            set
            {
                this.isEnabledFieldSpecified = value;
            }
        }

        /// <remarks/>
        public int maxBindingsPerService
        {
            get
            {
                return this.maxBindingsPerServiceField;
            }
            set
            {
                this.maxBindingsPerServiceField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxBindingsPerServiceSpecified
        {
            get
            {
                return this.maxBindingsPerServiceFieldSpecified;
            }
            set
            {
                this.maxBindingsPerServiceFieldSpecified = value;
            }
        }

        /// <remarks/>
        public int maxBusinesses
        {
            get
            {
                return this.maxBusinessesField;
            }
            set
            {
                this.maxBusinessesField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxBusinessesSpecified
        {
            get
            {
                return this.maxBusinessesFieldSpecified;
            }
            set
            {
                this.maxBusinessesFieldSpecified = value;
            }
        }

        /// <remarks/>
        public int maxServicePerBusiness
        {
            get
            {
                return this.maxServicePerBusinessField;
            }
            set
            {
                this.maxServicePerBusinessField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxServicePerBusinessSpecified
        {
            get
            {
                return this.maxServicePerBusinessFieldSpecified;
            }
            set
            {
                this.maxServicePerBusinessFieldSpecified = value;
            }
        }

        /// <remarks/>
        public int maxTModels
        {
            get
            {
                return this.maxTModelsField;
            }
            set
            {
                this.maxTModelsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxTModelsSpecified
        {
            get
            {
                return this.maxTModelsFieldSpecified;
            }
            set
            {
                this.maxTModelsFieldSpecified = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Signature", Namespace = "http://www.w3.org/2000/09/xmldsig#")]
        public SignatureType[] Signature
        {
            get
            {
                return this.signatureField;
            }
            set
            {
                this.signatureField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string authorizedName
        {
            get
            {
                return this.authorizedNameField;
            }
            set
            {
                this.authorizedNameField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_SubscriptionResponse
    {
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_SubscriptionRequest
    {

        private string authInfoField;

        private string publisherOrUsernameField;

        private subscription[] subscriptionsField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        public string publisherOrUsername
        {
            get
            {
                return this.publisherOrUsernameField;
            }
            set
            {
                this.publisherOrUsernameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("subscriptions")]
        public subscription[] subscriptions
        {
            get
            {
                return this.subscriptionsField;
            }
            set
            {
                this.subscriptionsField = value;
            }
        }
    }


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminDelete_SubscriptionResponse
    {
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminDelete_SubscriptionRequest
    {

        private string authInfoField;

        private string[] subscriptionKeyField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("subscriptionKey")]
        public string[] subscriptionKey
        {
            get
            {
                return this.subscriptionKeyField;
            }
            set
            {
                this.subscriptionKeyField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class subscriptionWrapper
    {

        private string publisherIdOrUsernameField;

        private subscription[] subscriptionField;

        /// <remarks/>
        public string publisherIdOrUsername
        {
            get
            {
                return this.publisherIdOrUsernameField;
            }
            set
            {
                this.publisherIdOrUsernameField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("subscription", Namespace = "urn:uddi-org:sub_v3")]
        public subscription[] subscription
        {
            get
            {
                return this.subscriptionField;
            }
            set
            {
                this.subscriptionField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_allClientSubscriptionInfo
    {

        private string authInfoField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class set_ReplicationNodesResponse
    {

        private dispositionReport dispositionReportField;

        /// <remarks/>
        public dispositionReport dispositionReport
        {
            get
            {
                return this.dispositionReportField;
            }
            set
            {
                this.dispositionReportField = value;
            }
        }
    }


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:uddi-org:repl_v3")]
    public partial class @operator
    {

        private string operatorNodeIDField;

        private operatorStatus_type operatorStatusField;

        private contact[] contactField;

        private string soapReplicationURLField;

        private KeyInfoType[] keyInfoField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "anyURI")]
        public string operatorNodeID
        {
            get
            {
                return this.operatorNodeIDField;
            }
            set
            {
                this.operatorNodeIDField = value;
            }
        }

        /// <remarks/>
        public operatorStatus_type operatorStatus
        {
            get
            {
                return this.operatorStatusField;
            }
            set
            {
                this.operatorStatusField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("contact", Namespace = "urn:uddi-org:api_v3")]
        public contact[] contact
        {
            get
            {
                return this.contactField;
            }
            set
            {
                this.contactField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "anyURI")]
        public string soapReplicationURL
        {
            get
            {
                return this.soapReplicationURLField;
            }
            set
            {
                this.soapReplicationURLField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("KeyInfo", Namespace = "http://www.w3.org/2000/09/xmldsig#")]
        public KeyInfoType[] KeyInfo
        {
            get
            {
                return this.keyInfoField;
            }
            set
            {
                this.keyInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:uddi-org:repl_v3")]
    public enum operatorStatus_type
    {

        /// <remarks/>
        @new,

        /// <remarks/>
        normal,

        /// <remarks/>
        resigned,
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:uddi-org:repl_v3")]
    public partial class replicationConfiguration
    {

        private string serialNumberField;

        private string timeOfConfigurationUpdateField;

        private replicationConfigurationRegistryContact registryContactField;

        private @operator[] operatorField;

        private communicationGraph communicationGraphField;

        private string maximumTimeToSyncRegistryField;

        private string maximumTimeToGetChangesField;

        private SignatureType[] signatureField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "integer")]
        public string serialNumber
        {
            get
            {
                return this.serialNumberField;
            }
            set
            {
                this.serialNumberField = value;
            }
        }

        /// <remarks/>
        public string timeOfConfigurationUpdate
        {
            get
            {
                return this.timeOfConfigurationUpdateField;
            }
            set
            {
                this.timeOfConfigurationUpdateField = value;
            }
        }

        /// <remarks/>
        public replicationConfigurationRegistryContact registryContact
        {
            get
            {
                return this.registryContactField;
            }
            set
            {
                this.registryContactField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("operator")]
        public @operator[] @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = value;
            }
        }

        /// <remarks/>
        public communicationGraph communicationGraph
        {
            get
            {
                return this.communicationGraphField;
            }
            set
            {
                this.communicationGraphField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "integer")]
        public string maximumTimeToSyncRegistry
        {
            get
            {
                return this.maximumTimeToSyncRegistryField;
            }
            set
            {
                this.maximumTimeToSyncRegistryField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "integer")]
        public string maximumTimeToGetChanges
        {
            get
            {
                return this.maximumTimeToGetChangesField;
            }
            set
            {
                this.maximumTimeToGetChangesField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Signature", Namespace = "http://www.w3.org/2000/09/xmldsig#")]
        public SignatureType[] Signature
        {
            get
            {
                return this.signatureField;
            }
            set
            {
                this.signatureField = value;
            }
        }
    }


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:uddi-org:repl_v3")]
    public partial class communicationGraph
    {

        private string[] nodeField;

        private string[] controlledMessageField;

        private communicationGraphEdge[] edgeField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("node", DataType = "anyURI")]
        public string[] node
        {
            get
            {
                return this.nodeField;
            }
            set
            {
                this.nodeField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("controlledMessage")]
        public string[] controlledMessage
        {
            get
            {
                return this.controlledMessageField;
            }
            set
            {
                this.controlledMessageField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("edge")]
        public communicationGraphEdge[] edge
        {
            get
            {
                return this.edgeField;
            }
            set
            {
                this.edgeField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:uddi-org:repl_v3")]
    public partial class communicationGraphEdge
    {

        private string[] messageField;

        private string messageSenderField;

        private string messageReceiverField;

        private string[] messageReceiverAlternateField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("message")]
        public string[] message
        {
            get
            {
                return this.messageField;
            }
            set
            {
                this.messageField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "anyURI")]
        public string messageSender
        {
            get
            {
                return this.messageSenderField;
            }
            set
            {
                this.messageSenderField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "anyURI")]
        public string messageReceiver
        {
            get
            {
                return this.messageReceiverField;
            }
            set
            {
                this.messageReceiverField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("messageReceiverAlternate", DataType = "anyURI")]
        public string[] messageReceiverAlternate
        {
            get
            {
                return this.messageReceiverAlternateField;
            }
            set
            {
                this.messageReceiverAlternateField = value;
            }
        }
    }
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:uddi-org:repl_v3")]
    public partial class replicationConfigurationRegistryContact
    {

        private contact contactField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:uddi-org:api_v3")]
        public contact contact
        {
            get
            {
                return this.contactField;
            }
            set
            {
                this.contactField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class set_ReplicationNodes
    {

        private string authInfoField;

        private replicationConfiguration replicationConfigurationField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:uddi-org:repl_v3")]
        public replicationConfiguration replicationConfiguration
        {
            get
            {
                return this.replicationConfigurationField;
            }
            set
            {
                this.replicationConfigurationField = value;
            }
        }
    }



    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_ReplicationNodesResponse
    {

        private replicationConfiguration replicationConfigurationField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:uddi-org:repl_v3")]
        public replicationConfiguration replicationConfiguration
        {
            get
            {
                return this.replicationConfigurationField;
            }
            set
            {
                this.replicationConfigurationField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_ReplicationNodes
    {

        private string authInfoField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_tModelResponse
    {

        private dispositionReport dispositionReportField;

        /// <remarks/>
        public dispositionReport dispositionReport
        {
            get
            {
                return this.dispositionReportField;
            }
            set
            {
                this.dispositionReportField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_tModelWrapper
    {

        private string publisherIDField;

        private tModel[] tModelField;

        /// <remarks/>
        public string publisherID
        {
            get
            {
                return this.publisherIDField;
            }
            set
            {
                this.publisherIDField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("tModel", IsNullable = true)]
        public tModel[] tModel
        {
            get
            {
                return this.tModelField;
            }
            set
            {
                this.tModelField = value;
            }
        }
    }


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_tModel
    {

        private string authInfoField;

        private adminSave_tModelWrapper[] valuesField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("values")]
        public adminSave_tModelWrapper[] values
        {
            get
            {
                return this.valuesField;
            }
            set
            {
                this.valuesField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_BusinessResponse
    {

        private dispositionReport dispositionReportField;

        /// <remarks/>
        public dispositionReport dispositionReport
        {
            get
            {
                return this.dispositionReportField;
            }
            set
            {
                this.dispositionReportField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_BusinessWrapper
    {

        private string publisherIDField;

        private businessEntity[] businessEntityField;

        /// <remarks/>
        public string publisherID
        {
            get
            {
                return this.publisherIDField;
            }
            set
            {
                this.publisherIDField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("businessEntity", Namespace = "urn:uddi-org:api_v3")]
        public businessEntity[] businessEntity
        {
            get
            {
                return this.businessEntityField;
            }
            set
            {
                this.businessEntityField = value;
            }
        }
    }



    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class adminSave_Business
    {

        private string authInfoField;

        private adminSave_BusinessWrapper[] valuesField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("values")]
        public adminSave_BusinessWrapper[] values
        {
            get
            {
                return this.valuesField;
            }
            set
            {
                this.valuesField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class delete_Clerk
    {

        private string authInfoField;

        private string clerkIDField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        public string clerkID
        {
            get
            {
                return this.clerkIDField;
            }
            set
            {
                this.clerkIDField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class delete_Node
    {

        private string authInfoField;

        private string nodeIDField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        public string nodeID
        {
            get
            {
                return this.nodeIDField;
            }
            set
            {
                this.nodeIDField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_AllClerksResponse
    {

        private clerk[] clerkListField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(IsNullable = true)]
        public clerk[] clerkList
        {
            get
            {
                return this.clerkListField;
            }
            set
            {
                this.clerkListField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class clerk
    {

        private string nameField;

        private node nodeField;

        private string publisherField;

        private string passwordField;

        /// <remarks/>
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }

        /// <remarks/>
        public node node
        {
            get
            {
                return this.nodeField;
            }
            set
            {
                this.nodeField = value;
            }
        }

        /// <remarks/>
        public string publisher
        {
            get
            {
                return this.publisherField;
            }
            set
            {
                this.publisherField = value;
            }
        }

        /// <remarks/>
        public string password
        {
            get
            {
                return this.passwordField;
            }
            set
            {
                this.passwordField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class node
    {

        private string nameField;

        private string clientNameField;

        private string descriptionField;

        private string custodyTransferUrlField;

        private string inquiryUrlField;

        private string publishUrlField;

        private string securityUrlField;

        private string subscriptionUrlField;

        private string subscriptionListenerUrlField;

        private string replicationUrlField;

        private string juddiApiUrlField;

        private string proxyTransportField;

        private string factoryInitialField;

        private string factoryURLPkgsField;

        private string factoryNamingProviderField;

        /// <remarks/>
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }

        /// <remarks/>
        public string clientName
        {
            get
            {
                return this.clientNameField;
            }
            set
            {
                this.clientNameField = value;
            }
        }

        /// <remarks/>
        public string description
        {
            get
            {
                return this.descriptionField;
            }
            set
            {
                this.descriptionField = value;
            }
        }

        /// <remarks/>
        public string custodyTransferUrl
        {
            get
            {
                return this.custodyTransferUrlField;
            }
            set
            {
                this.custodyTransferUrlField = value;
            }
        }

        /// <remarks/>
        public string inquiryUrl
        {
            get
            {
                return this.inquiryUrlField;
            }
            set
            {
                this.inquiryUrlField = value;
            }
        }

        /// <remarks/>
        public string publishUrl
        {
            get
            {
                return this.publishUrlField;
            }
            set
            {
                this.publishUrlField = value;
            }
        }

        /// <remarks/>
        public string securityUrl
        {
            get
            {
                return this.securityUrlField;
            }
            set
            {
                this.securityUrlField = value;
            }
        }

        /// <remarks/>
        public string subscriptionUrl
        {
            get
            {
                return this.subscriptionUrlField;
            }
            set
            {
                this.subscriptionUrlField = value;
            }
        }

        /// <remarks/>
        public string subscriptionListenerUrl
        {
            get
            {
                return this.subscriptionListenerUrlField;
            }
            set
            {
                this.subscriptionListenerUrlField = value;
            }
        }

        /// <remarks/>
        public string replicationUrl
        {
            get
            {
                return this.replicationUrlField;
            }
            set
            {
                this.replicationUrlField = value;
            }
        }

        /// <remarks/>
        public string juddiApiUrl
        {
            get
            {
                return this.juddiApiUrlField;
            }
            set
            {
                this.juddiApiUrlField = value;
            }
        }

        /// <remarks/>
        public string proxyTransport
        {
            get
            {
                return this.proxyTransportField;
            }
            set
            {
                this.proxyTransportField = value;
            }
        }

        /// <remarks/>
        public string factoryInitial
        {
            get
            {
                return this.factoryInitialField;
            }
            set
            {
                this.factoryInitialField = value;
            }
        }

        /// <remarks/>
        public string factoryURLPkgs
        {
            get
            {
                return this.factoryURLPkgsField;
            }
            set
            {
                this.factoryURLPkgsField = value;
            }
        }

        /// <remarks/>
        public string factoryNamingProvider
        {
            get
            {
                return this.factoryNamingProviderField;
            }
            set
            {
                this.factoryNamingProviderField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_AllClerks
    {

        private string authInfoField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_AllNodesResponse
    {

        private node[] nodeListField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(IsNullable = true)]
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public node[] nodeList
        {
            get
            {
                return this.nodeListField;
            }
            set
            {
                this.nodeListField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_AllNodes
    {

        private string authInfoField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }
    }


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class syncSubscriptionDetailResponse
    {

        private subscriptionResultsList[] syncSubscriptionDetailField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(IsNullable = true)]
        public subscriptionResultsList[] syncSubscriptionDetail
        {
            get
            {
                return this.syncSubscriptionDetailField;
            }
            set
            {
                this.syncSubscriptionDetailField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:uddi-org:sub_v3")]
    public partial class get_subscriptionResults
    {

        private string authInfoField;

        private string subscriptionKeyField;

        private coveragePeriod coveragePeriodField;

        private string chunkTokenField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:uddi-org:api_v3")]
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "anyURI")]
        public string subscriptionKey
        {
            get
            {
                return this.subscriptionKeyField;
            }
            set
            {
                this.subscriptionKeyField = value;
            }
        }

        /// <remarks/>
        public coveragePeriod coveragePeriod
        {
            get
            {
                return this.coveragePeriodField;
            }
            set
            {
                this.coveragePeriodField = value;
            }
        }

        /// <remarks/>
        public string chunkToken
        {
            get
            {
                return this.chunkTokenField;
            }
            set
            {
                this.chunkTokenField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class syncSubscription
    {

        private string authInfoField;

        private get_subscriptionResults[] get_subscriptionResultsListField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("get_subscriptionResultsList", IsNullable = true)]
        public get_subscriptionResults[] get_subscriptionResultsList
        {
            get
            {
                return this.get_subscriptionResultsListField;
            }
            set
            {
                this.get_subscriptionResultsListField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class syncSubscriptionRequest
    {

        private syncSubscription syncSubscriptionField;

        /// <remarks/>
        public syncSubscription syncSubscription
        {
            get
            {
                return this.syncSubscriptionField;
            }
            set
            {
                this.syncSubscriptionField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class clientSubscriptionInfo
    {

        private string subscriptionKeyField;

        private clerk fromClerkField;

        private clerk toClerkField;

        private System.DateTime lastModifiedField;

        private bool lastModifiedFieldSpecified;

        private System.DateTime lastNotifiedField;

        private bool lastNotifiedFieldSpecified;

        /// <remarks/>
        public string subscriptionKey
        {
            get
            {
                return this.subscriptionKeyField;
            }
            set
            {
                this.subscriptionKeyField = value;
            }
        }

        /// <remarks/>
        public clerk fromClerk
        {
            get
            {
                return this.fromClerkField;
            }
            set
            {
                this.fromClerkField = value;
            }
        }

        /// <remarks/>
        public clerk toClerk
        {
            get
            {
                return this.toClerkField;
            }
            set
            {
                this.toClerkField = value;
            }
        }

        /// <remarks/>
        public System.DateTime lastModified
        {
            get
            {
                return this.lastModifiedField;
            }
            set
            {
                this.lastModifiedField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool lastModifiedSpecified
        {
            get
            {
                return this.lastModifiedFieldSpecified;
            }
            set
            {
                this.lastModifiedFieldSpecified = value;
            }
        }

        /// <remarks/>
        public System.DateTime lastNotified
        {
            get
            {
                return this.lastNotifiedField;
            }
            set
            {
                this.lastNotifiedField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool lastNotifiedSpecified
        {
            get
            {
                return this.lastNotifiedFieldSpecified;
            }
            set
            {
                this.lastNotifiedFieldSpecified = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class save_clientSubscriptionInfo
    {

        private string authInfoField;

        private clientSubscriptionInfo[] clientSubscriptionInfoField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("clientSubscriptionInfo")]
        public clientSubscriptionInfo[] clientSubscriptionInfo
        {
            get
            {
                return this.clientSubscriptionInfoField;
            }
            set
            {
                this.clientSubscriptionInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:uddi-org:api_v3")]
    public partial class delete_tModel
    {

        private string authInfoField;

        private string[] tModelKeyField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("tModelKey", DataType = "anyURI")]
        public string[] tModelKey
        {
            get
            {
                return this.tModelKeyField;
            }
            set
            {
                this.tModelKeyField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class save_node
    {

        private string authInfoField;

        private node[] nodeField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("node")]
        public node[] node
        {
            get
            {
                return this.nodeField;
            }
            set
            {
                this.nodeField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class publisherDetail
    {

        private publisher[] publisherField;

        private bool truncatedField;

        private bool truncatedFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("publisher", IsNullable = true)]
        public publisher[] publisher
        {
            get
            {
                return this.publisherField;
            }
            set
            {
                this.publisherField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public bool truncated
        {
            get
            {
                return this.truncatedField;
            }
            set
            {
                this.truncatedField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool truncatedSpecified
        {
            get
            {
                return this.truncatedFieldSpecified;
            }
            set
            {
                this.truncatedFieldSpecified = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class save_publisher
    {

        private string authInfoField;

        private publisher[] publisherField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("publisher")]
        public publisher[] publisher
        {
            get
            {
                return this.publisherField;
            }
            set
            {
                this.publisherField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class delete_publisher
    {

        private string authInfoField;

        private string[] publisherIdField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("publisherId")]
        public string[] publisherId
        {
            get
            {
                return this.publisherIdField;
            }
            set
            {
                this.publisherIdField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class get_allPublisherDetail
    {

        private string authInfoField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:uddi-org:api_v3")]
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class save_clerk
    {

        private string authInfoField;

        private clerk[] clerkField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("clerk")]
        public clerk[] clerk
        {
            get
            {
                return this.clerkField;
            }
            set
            {
                this.clerkField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:juddi-apache-org:api_v3")]
    public partial class delete_clientSubscriptionInfo
    {

        private string authInfoField;

        private string[] subscriptionKeyField;

        /// <remarks/>
        public string authInfo
        {
            get
            {
                return this.authInfoField;
            }
            set
            {
                this.authInfoField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("subscriptionKey")]
        public string[] subscriptionKey
        {
            get
            {
                return this.subscriptionKeyField;
            }
            set
            {
                this.subscriptionKeyField = value;
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_publisherDetailCompletedEventHandler(object sender, get_publisherDetailCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_publisherDetailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_publisherDetailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public publisher[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((publisher[])(this.results[0]));
            }
        }

        /// <remarks/>
        public bool truncated
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((bool)(this.results[1]));
            }
        }

        /// <remarks/>
        public bool truncatedSpecified
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((bool)(this.results[2]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void delete_ClientSubscriptionInfoCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void save_ClerkCompletedEventHandler(object sender, save_ClerkCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class save_ClerkCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal save_ClerkCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public clerk[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((clerk[])(this.results[0]));
            }
        }
    }
    /*
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_allPublisherDetailCompletedEventHandler(object sender, get_allPublisherDetailCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_allPublisherDetailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_allPublisherDetailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public object[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((object[])(this.results[0]));
            }
        }
    }*/

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void delete_publisherCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void save_publisherCompletedEventHandler(object sender, save_publisherCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class save_publisherCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal save_publisherCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public publisherDetail Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((publisherDetail)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void save_NodeCompletedEventHandler(object sender, save_NodeCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class save_NodeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal save_NodeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public node[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((node[])(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void adminDelete_tModelCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void save_ClientSubscriptionInfoCompletedEventHandler(object sender, save_ClientSubscriptionInfoCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class save_ClientSubscriptionInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal save_ClientSubscriptionInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public clientSubscriptionInfo[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((clientSubscriptionInfo[])(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void invoke_SyncSubscriptionCompletedEventHandler(object sender, invoke_SyncSubscriptionCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class invoke_SyncSubscriptionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal invoke_SyncSubscriptionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public syncSubscriptionDetailResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((syncSubscriptionDetailResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_AllNodesCompletedEventHandler(object sender, get_AllNodesCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_AllNodesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_AllNodesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public get_AllNodesResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((get_AllNodesResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_AllClerksCompletedEventHandler(object sender, get_AllClerksCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_AllClerksCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_AllClerksCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public get_AllClerksResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((get_AllClerksResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void delete_NodeCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void delete_ClerkCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void adminSave_BusinessCompletedEventHandler(object sender, adminSave_BusinessCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class adminSave_BusinessCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal adminSave_BusinessCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public adminSave_BusinessResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((adminSave_BusinessResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void adminSave_tModelCompletedEventHandler(object sender, adminSave_tModelCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class adminSave_tModelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal adminSave_tModelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public adminSave_tModelResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((adminSave_tModelResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_ReplicationNodesCompletedEventHandler(object sender, get_ReplicationNodesCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_ReplicationNodesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_ReplicationNodesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public get_ReplicationNodesResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((get_ReplicationNodesResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void set_ReplicationNodesCompletedEventHandler(object sender, set_ReplicationNodesCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class set_ReplicationNodesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal set_ReplicationNodesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public set_ReplicationNodesResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((set_ReplicationNodesResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void get_allClientSubscriptionInfoCompletedEventHandler(object sender, get_allClientSubscriptionInfoCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class get_allClientSubscriptionInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal get_allClientSubscriptionInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public subscriptionWrapper[] Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((subscriptionWrapper[])(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void adminDelete_SubscriptionCompletedEventHandler(object sender, adminDelete_SubscriptionCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class adminDelete_SubscriptionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal adminDelete_SubscriptionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public adminDelete_SubscriptionResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((adminDelete_SubscriptionResponse)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    public delegate void adminSave_SubscriptionCompletedEventHandler(object sender, adminSave_SubscriptionCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class adminSave_SubscriptionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
    {

        private object[] results;

        internal adminSave_SubscriptionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
            base(exception, cancelled, userState)
        {
            this.results = results;
        }

        /// <remarks/>
        public adminSave_SubscriptionResponse Result
        {
            get
            {
                this.RaiseExceptionIfNecessary();
                return ((adminSave_SubscriptionResponse)(this.results[0]));
            }
        }
    }
}
