/*
 * 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.18408
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

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.uddi.apiv2
{

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name = "InquireSoap", Namespace = "urn:uddi-org:inquiry_v2")]
    public partial class InquireSoap : System.Web.Services.Protocols.SoapHttpClientProtocol
    {

        private System.Threading.SendOrPostCallback find_bindingOperationCompleted;

        private System.Threading.SendOrPostCallback find_businessOperationCompleted;

        private System.Threading.SendOrPostCallback find_relatedBusinessesOperationCompleted;

        private System.Threading.SendOrPostCallback find_serviceOperationCompleted;

        private System.Threading.SendOrPostCallback find_tModelOperationCompleted;

        private System.Threading.SendOrPostCallback get_bindingDetailOperationCompleted;

        private System.Threading.SendOrPostCallback get_businessDetailOperationCompleted;

        private System.Threading.SendOrPostCallback get_businessDetailExtOperationCompleted;

        private System.Threading.SendOrPostCallback get_serviceDetailOperationCompleted;

        private System.Threading.SendOrPostCallback get_tModelDetailOperationCompleted;

        /// <remarks/>
        public InquireSoap()
        {
            this.Url = "http://localhost/uddi/inquire/";
        }

        /// <remarks/>
        public event find_bindingCompletedEventHandler find_bindingCompleted;

        /// <remarks/>
        public event find_businessCompletedEventHandler find_businessCompleted;

        /// <remarks/>
        public event find_relatedBusinessesCompletedEventHandler find_relatedBusinessesCompleted;

        /// <remarks/>
        public event find_serviceCompletedEventHandler find_serviceCompleted;

        /// <remarks/>
        public event find_tModelCompletedEventHandler find_tModelCompleted;

        /// <remarks/>
        public event get_bindingDetailCompletedEventHandler get_bindingDetailCompleted;

        /// <remarks/>
        public event get_businessDetailCompletedEventHandler get_businessDetailCompleted;

        /// <remarks/>
        public event get_businessDetailExtCompletedEventHandler get_businessDetailExtCompleted;

        /// <remarks/>
        public event get_serviceDetailCompletedEventHandler get_serviceDetailCompleted;

        /// <remarks/>
        public event get_tModelDetailCompletedEventHandler get_tModelDetailCompleted;

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("find_binding", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("bindingDetail", Namespace = "urn:uddi-org:api_v2")]
        public bindingDetail find_binding([System.Xml.Serialization.XmlElementAttribute("find_binding", Namespace = "urn:uddi-org:api_v2")] find_binding find_binding1)
        {
            object[] results = this.Invoke("find_binding", new object[] {
                    find_binding1});
            return ((bindingDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void find_bindingAsync(find_binding find_binding1)
        {
            this.find_bindingAsync(find_binding1, null);
        }

        /// <remarks/>
        public void find_bindingAsync(find_binding find_binding1, object userState)
        {
            if ((this.find_bindingOperationCompleted == null))
            {
                this.find_bindingOperationCompleted = new System.Threading.SendOrPostCallback(this.Onfind_bindingOperationCompleted);
            }
            this.InvokeAsync("find_binding", new object[] {
                    find_binding1}, this.find_bindingOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("find_business", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("businessList", Namespace = "urn:uddi-org:api_v2")]
        public businessList find_business([System.Xml.Serialization.XmlElementAttribute("find_business", Namespace = "urn:uddi-org:api_v2")] find_business find_business1)
        {
            object[] results = this.Invoke("find_business", new object[] {
                    find_business1});
            return ((businessList)(results[0]));
        }

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

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

        /// <remarks/>
        public void find_businessAsync(find_business find_business1)
        {
            this.find_businessAsync(find_business1, null);
        }

        /// <remarks/>
        public void find_businessAsync(find_business find_business1, object userState)
        {
            if ((this.find_businessOperationCompleted == null))
            {
                this.find_businessOperationCompleted = new System.Threading.SendOrPostCallback(this.Onfind_businessOperationCompleted);
            }
            this.InvokeAsync("find_business", new object[] {
                    find_business1}, this.find_businessOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("find_relatedBusinesses", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("relatedBusinessesList", Namespace = "urn:uddi-org:api_v2")]
        public relatedBusinessesList find_relatedBusinesses([System.Xml.Serialization.XmlElementAttribute("find_relatedBusinesses", Namespace = "urn:uddi-org:api_v2")] find_relatedBusinesses find_relatedBusinesses1)
        {
            object[] results = this.Invoke("find_relatedBusinesses", new object[] {
                    find_relatedBusinesses1});
            return ((relatedBusinessesList)(results[0]));
        }

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

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

        /// <remarks/>
        public void find_relatedBusinessesAsync(find_relatedBusinesses find_relatedBusinesses1)
        {
            this.find_relatedBusinessesAsync(find_relatedBusinesses1, null);
        }

        /// <remarks/>
        public void find_relatedBusinessesAsync(find_relatedBusinesses find_relatedBusinesses1, object userState)
        {
            if ((this.find_relatedBusinessesOperationCompleted == null))
            {
                this.find_relatedBusinessesOperationCompleted = new System.Threading.SendOrPostCallback(this.Onfind_relatedBusinessesOperationCompleted);
            }
            this.InvokeAsync("find_relatedBusinesses", new object[] {
                    find_relatedBusinesses1}, this.find_relatedBusinessesOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("find_service", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("serviceList", Namespace = "urn:uddi-org:api_v2")]
        public serviceList find_service([System.Xml.Serialization.XmlElementAttribute("find_service", Namespace = "urn:uddi-org:api_v2")] find_service find_service1)
        {
            object[] results = this.Invoke("find_service", new object[] {
                    find_service1});
            return ((serviceList)(results[0]));
        }

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

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

        /// <remarks/>
        public void find_serviceAsync(find_service find_service1)
        {
            this.find_serviceAsync(find_service1, null);
        }

        /// <remarks/>
        public void find_serviceAsync(find_service find_service1, object userState)
        {
            if ((this.find_serviceOperationCompleted == null))
            {
                this.find_serviceOperationCompleted = new System.Threading.SendOrPostCallback(this.Onfind_serviceOperationCompleted);
            }
            this.InvokeAsync("find_service", new object[] {
                    find_service1}, this.find_serviceOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("find_tModel", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("tModelList", Namespace = "urn:uddi-org:api_v2")]
        public tModelList find_tModel([System.Xml.Serialization.XmlElementAttribute("find_tModel", Namespace = "urn:uddi-org:api_v2")] find_tModel find_tModel1)
        {
            object[] results = this.Invoke("find_tModel", new object[] {
                    find_tModel1});
            return ((tModelList)(results[0]));
        }

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

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

        /// <remarks/>
        public void find_tModelAsync(find_tModel find_tModel1)
        {
            this.find_tModelAsync(find_tModel1, null);
        }

        /// <remarks/>
        public void find_tModelAsync(find_tModel find_tModel1, object userState)
        {
            if ((this.find_tModelOperationCompleted == null))
            {
                this.find_tModelOperationCompleted = new System.Threading.SendOrPostCallback(this.Onfind_tModelOperationCompleted);
            }
            this.InvokeAsync("find_tModel", new object[] {
                    find_tModel1}, this.find_tModelOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_bindingDetail", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("bindingDetail", Namespace = "urn:uddi-org:api_v2")]
        public bindingDetail get_bindingDetail([System.Xml.Serialization.XmlElementAttribute("get_bindingDetail", Namespace = "urn:uddi-org:api_v2")] get_bindingDetail get_bindingDetail1)
        {
            object[] results = this.Invoke("get_bindingDetail", new object[] {
                    get_bindingDetail1});
            return ((bindingDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_bindingDetailAsync(get_bindingDetail get_bindingDetail1)
        {
            this.get_bindingDetailAsync(get_bindingDetail1, null);
        }

        /// <remarks/>
        public void get_bindingDetailAsync(get_bindingDetail get_bindingDetail1, object userState)
        {
            if ((this.get_bindingDetailOperationCompleted == null))
            {
                this.get_bindingDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_bindingDetailOperationCompleted);
            }
            this.InvokeAsync("get_bindingDetail", new object[] {
                    get_bindingDetail1}, this.get_bindingDetailOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_businessDetail", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("businessDetail", Namespace = "urn:uddi-org:api_v2")]
        public businessDetail get_businessDetail([System.Xml.Serialization.XmlElementAttribute("get_businessDetail", Namespace = "urn:uddi-org:api_v2")] get_businessDetail get_businessDetail1)
        {
            object[] results = this.Invoke("get_businessDetail", new object[] {
                    get_businessDetail1});
            return ((businessDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_businessDetailAsync(get_businessDetail get_businessDetail1)
        {
            this.get_businessDetailAsync(get_businessDetail1, null);
        }

        /// <remarks/>
        public void get_businessDetailAsync(get_businessDetail get_businessDetail1, object userState)
        {
            if ((this.get_businessDetailOperationCompleted == null))
            {
                this.get_businessDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_businessDetailOperationCompleted);
            }
            this.InvokeAsync("get_businessDetail", new object[] {
                    get_businessDetail1}, this.get_businessDetailOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_businessDetailExt", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("businessDetailExt", Namespace = "urn:uddi-org:api_v2")]
        public businessDetailExt get_businessDetailExt([System.Xml.Serialization.XmlElementAttribute("get_businessDetailExt", Namespace = "urn:uddi-org:api_v2")] get_businessDetailExt get_businessDetailExt1)
        {
            object[] results = this.Invoke("get_businessDetailExt", new object[] {
                    get_businessDetailExt1});
            return ((businessDetailExt)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_businessDetailExtAsync(get_businessDetailExt get_businessDetailExt1)
        {
            this.get_businessDetailExtAsync(get_businessDetailExt1, null);
        }

        /// <remarks/>
        public void get_businessDetailExtAsync(get_businessDetailExt get_businessDetailExt1, object userState)
        {
            if ((this.get_businessDetailExtOperationCompleted == null))
            {
                this.get_businessDetailExtOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_businessDetailExtOperationCompleted);
            }
            this.InvokeAsync("get_businessDetailExt", new object[] {
                    get_businessDetailExt1}, this.get_businessDetailExtOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_serviceDetail", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("serviceDetail", Namespace = "urn:uddi-org:api_v2")]
        public serviceDetail get_serviceDetail([System.Xml.Serialization.XmlElementAttribute("get_serviceDetail", Namespace = "urn:uddi-org:api_v2")] get_serviceDetail get_serviceDetail1)
        {
            object[] results = this.Invoke("get_serviceDetail", new object[] {
                    get_serviceDetail1});
            return ((serviceDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_serviceDetailAsync(get_serviceDetail get_serviceDetail1)
        {
            this.get_serviceDetailAsync(get_serviceDetail1, null);
        }

        /// <remarks/>
        public void get_serviceDetailAsync(get_serviceDetail get_serviceDetail1, object userState)
        {
            if ((this.get_serviceDetailOperationCompleted == null))
            {
                this.get_serviceDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_serviceDetailOperationCompleted);
            }
            this.InvokeAsync("get_serviceDetail", new object[] {
                    get_serviceDetail1}, this.get_serviceDetailOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_tModelDetail", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("tModelDetail", Namespace = "urn:uddi-org:api_v2")]
        public tModelDetail get_tModelDetail([System.Xml.Serialization.XmlElementAttribute("get_tModelDetail", Namespace = "urn:uddi-org:api_v2")] get_tModelDetail get_tModelDetail1)
        {
            object[] results = this.Invoke("get_tModelDetail", new object[] {
                    get_tModelDetail1});
            return ((tModelDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_tModelDetailAsync(get_tModelDetail get_tModelDetail1)
        {
            this.get_tModelDetailAsync(get_tModelDetail1, null);
        }

        /// <remarks/>
        public void get_tModelDetailAsync(get_tModelDetail get_tModelDetail1, object userState)
        {
            if ((this.get_tModelDetailOperationCompleted == null))
            {
                this.get_tModelDetailOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_tModelDetailOperationCompleted);
            }
            this.InvokeAsync("get_tModelDetail", new object[] {
                    get_tModelDetail1}, this.get_tModelDetailOperationCompleted, userState);
        }

        private void Onget_tModelDetailOperationCompleted(object arg)
        {
            if ((this.get_tModelDetailCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.get_tModelDetailCompleted(this, new get_tModelDetailCompletedEventArgs(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.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name = "PublishSoap", Namespace = "urn:uddi-org:publication_v2")]
    public partial class PublishSoap : System.Web.Services.Protocols.SoapHttpClientProtocol
    {

        private System.Threading.SendOrPostCallback add_publisherAssertionsOperationCompleted;

        private System.Threading.SendOrPostCallback delete_bindingOperationCompleted;

        private System.Threading.SendOrPostCallback delete_businessOperationCompleted;

        private System.Threading.SendOrPostCallback delete_publisherAssertionsOperationCompleted;

        private System.Threading.SendOrPostCallback delete_serviceOperationCompleted;

        private System.Threading.SendOrPostCallback delete_tModelOperationCompleted;

        private System.Threading.SendOrPostCallback discard_authTokenOperationCompleted;

        private System.Threading.SendOrPostCallback get_assertionStatusReportOperationCompleted;

        private System.Threading.SendOrPostCallback get_authTokenOperationCompleted;

        private System.Threading.SendOrPostCallback get_publisherAssertionsOperationCompleted;

        private System.Threading.SendOrPostCallback get_registeredInfoOperationCompleted;

        private System.Threading.SendOrPostCallback save_bindingOperationCompleted;

        private System.Threading.SendOrPostCallback save_businessOperationCompleted;

        private System.Threading.SendOrPostCallback save_serviceOperationCompleted;

        private System.Threading.SendOrPostCallback save_tModelOperationCompleted;

        private System.Threading.SendOrPostCallback set_publisherAssertionsOperationCompleted;

        /// <remarks/>
        public PublishSoap()
        {
            this.Url = "http://localhost/uddi/publish/";
        }

        /// <remarks/>
        public event add_publisherAssertionsCompletedEventHandler add_publisherAssertionsCompleted;

        /// <remarks/>
        public event delete_bindingCompletedEventHandler delete_bindingCompleted;

        /// <remarks/>
        public event delete_businessCompletedEventHandler delete_businessCompleted;

        /// <remarks/>
        public event delete_publisherAssertionsCompletedEventHandler delete_publisherAssertionsCompleted;

        /// <remarks/>
        public event delete_serviceCompletedEventHandler delete_serviceCompleted;

        /// <remarks/>
        public event delete_tModelCompletedEventHandler delete_tModelCompleted;

        /// <remarks/>
        public event discard_authTokenCompletedEventHandler discard_authTokenCompleted;

        /// <remarks/>
        public event get_assertionStatusReportCompletedEventHandler get_assertionStatusReportCompleted;

        /// <remarks/>
        public event get_authTokenCompletedEventHandler get_authTokenCompleted;

        /// <remarks/>
        public event get_publisherAssertionsCompletedEventHandler get_publisherAssertionsCompleted;

        /// <remarks/>
        public event get_registeredInfoCompletedEventHandler get_registeredInfoCompleted;

        /// <remarks/>
        public event save_bindingCompletedEventHandler save_bindingCompleted;

        /// <remarks/>
        public event save_businessCompletedEventHandler save_businessCompleted;

        /// <remarks/>
        public event save_serviceCompletedEventHandler save_serviceCompleted;

        /// <remarks/>
        public event save_tModelCompletedEventHandler save_tModelCompleted;

        /// <remarks/>
        public event set_publisherAssertionsCompletedEventHandler set_publisherAssertionsCompleted;

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("add_publisherAssertions", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport add_publisherAssertions([System.Xml.Serialization.XmlElementAttribute("add_publisherAssertions", Namespace = "urn:uddi-org:api_v2")] add_publisherAssertions add_publisherAssertions1)
        {
            object[] results = this.Invoke("add_publisherAssertions", new object[] {
                    add_publisherAssertions1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void add_publisherAssertionsAsync(add_publisherAssertions add_publisherAssertions1)
        {
            this.add_publisherAssertionsAsync(add_publisherAssertions1, null);
        }

        /// <remarks/>
        public void add_publisherAssertionsAsync(add_publisherAssertions add_publisherAssertions1, object userState)
        {
            if ((this.add_publisherAssertionsOperationCompleted == null))
            {
                this.add_publisherAssertionsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onadd_publisherAssertionsOperationCompleted);
            }
            this.InvokeAsync("add_publisherAssertions", new object[] {
                    add_publisherAssertions1}, this.add_publisherAssertionsOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_binding", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport delete_binding([System.Xml.Serialization.XmlElementAttribute("delete_binding", Namespace = "urn:uddi-org:api_v2")] delete_binding delete_binding1)
        {
            object[] results = this.Invoke("delete_binding", new object[] {
                    delete_binding1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void delete_bindingAsync(delete_binding delete_binding1)
        {
            this.delete_bindingAsync(delete_binding1, null);
        }

        /// <remarks/>
        public void delete_bindingAsync(delete_binding delete_binding1, object userState)
        {
            if ((this.delete_bindingOperationCompleted == null))
            {
                this.delete_bindingOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_bindingOperationCompleted);
            }
            this.InvokeAsync("delete_binding", new object[] {
                    delete_binding1}, this.delete_bindingOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_business", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport delete_business([System.Xml.Serialization.XmlElementAttribute("delete_business", Namespace = "urn:uddi-org:api_v2")] delete_business delete_business1)
        {
            object[] results = this.Invoke("delete_business", new object[] {
                    delete_business1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void delete_businessAsync(delete_business delete_business1)
        {
            this.delete_businessAsync(delete_business1, null);
        }

        /// <remarks/>
        public void delete_businessAsync(delete_business delete_business1, object userState)
        {
            if ((this.delete_businessOperationCompleted == null))
            {
                this.delete_businessOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_businessOperationCompleted);
            }
            this.InvokeAsync("delete_business", new object[] {
                    delete_business1}, this.delete_businessOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_publisherAssertions", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport delete_publisherAssertions([System.Xml.Serialization.XmlElementAttribute("delete_publisherAssertions", Namespace = "urn:uddi-org:api_v2")] delete_publisherAssertions delete_publisherAssertions1)
        {
            object[] results = this.Invoke("delete_publisherAssertions", new object[] {
                    delete_publisherAssertions1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void delete_publisherAssertionsAsync(delete_publisherAssertions delete_publisherAssertions1)
        {
            this.delete_publisherAssertionsAsync(delete_publisherAssertions1, null);
        }

        /// <remarks/>
        public void delete_publisherAssertionsAsync(delete_publisherAssertions delete_publisherAssertions1, object userState)
        {
            if ((this.delete_publisherAssertionsOperationCompleted == null))
            {
                this.delete_publisherAssertionsOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_publisherAssertionsOperationCompleted);
            }
            this.InvokeAsync("delete_publisherAssertions", new object[] {
                    delete_publisherAssertions1}, this.delete_publisherAssertionsOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_service", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport delete_service([System.Xml.Serialization.XmlElementAttribute("delete_service", Namespace = "urn:uddi-org:api_v2")] delete_service delete_service1)
        {
            object[] results = this.Invoke("delete_service", new object[] {
                    delete_service1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void delete_serviceAsync(delete_service delete_service1)
        {
            this.delete_serviceAsync(delete_service1, null);
        }

        /// <remarks/>
        public void delete_serviceAsync(delete_service delete_service1, object userState)
        {
            if ((this.delete_serviceOperationCompleted == null))
            {
                this.delete_serviceOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_serviceOperationCompleted);
            }
            this.InvokeAsync("delete_service", new object[] {
                    delete_service1}, this.delete_serviceOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("delete_tModel", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport delete_tModel([System.Xml.Serialization.XmlElementAttribute("delete_tModel", Namespace = "urn:uddi-org:api_v2")] delete_tModel delete_tModel1)
        {
            object[] results = this.Invoke("delete_tModel", new object[] {
                    delete_tModel1});
            return ((dispositionReport)(results[0]));
        }

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

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

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

        /// <remarks/>
        public void delete_tModelAsync(delete_tModel delete_tModel1, object userState)
        {
            if ((this.delete_tModelOperationCompleted == null))
            {
                this.delete_tModelOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondelete_tModelOperationCompleted);
            }
            this.InvokeAsync("delete_tModel", new object[] {
                    delete_tModel1}, this.delete_tModelOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("discard_authToken", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("dispositionReport", Namespace = "urn:uddi-org:api_v2")]
        public dispositionReport discard_authToken([System.Xml.Serialization.XmlElementAttribute("discard_authToken", Namespace = "urn:uddi-org:api_v2")] discard_authToken discard_authToken1)
        {
            object[] results = this.Invoke("discard_authToken", new object[] {
                    discard_authToken1});
            return ((dispositionReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void discard_authTokenAsync(discard_authToken discard_authToken1)
        {
            this.discard_authTokenAsync(discard_authToken1, null);
        }

        /// <remarks/>
        public void discard_authTokenAsync(discard_authToken discard_authToken1, object userState)
        {
            if ((this.discard_authTokenOperationCompleted == null))
            {
                this.discard_authTokenOperationCompleted = new System.Threading.SendOrPostCallback(this.Ondiscard_authTokenOperationCompleted);
            }
            this.InvokeAsync("discard_authToken", new object[] {
                    discard_authToken1}, this.discard_authTokenOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_assertionStatusReport", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("assertionStatusReport", Namespace = "urn:uddi-org:api_v2")]
        public assertionStatusReport get_assertionStatusReport([System.Xml.Serialization.XmlElementAttribute("get_assertionStatusReport", Namespace = "urn:uddi-org:api_v2")] get_assertionStatusReport get_assertionStatusReport1)
        {
            object[] results = this.Invoke("get_assertionStatusReport", new object[] {
                    get_assertionStatusReport1});
            return ((assertionStatusReport)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_assertionStatusReportAsync(get_assertionStatusReport get_assertionStatusReport1)
        {
            this.get_assertionStatusReportAsync(get_assertionStatusReport1, null);
        }

        /// <remarks/>
        public void get_assertionStatusReportAsync(get_assertionStatusReport get_assertionStatusReport1, object userState)
        {
            if ((this.get_assertionStatusReportOperationCompleted == null))
            {
                this.get_assertionStatusReportOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_assertionStatusReportOperationCompleted);
            }
            this.InvokeAsync("get_assertionStatusReport", new object[] {
                    get_assertionStatusReport1}, this.get_assertionStatusReportOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_authToken", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("authToken", Namespace = "urn:uddi-org:api_v2")]
        public authToken get_authToken([System.Xml.Serialization.XmlElementAttribute("get_authToken", Namespace = "urn:uddi-org:api_v2")] get_authToken get_authToken1)
        {
            object[] results = this.Invoke("get_authToken", new object[] {
                    get_authToken1});
            return ((authToken)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_authTokenAsync(get_authToken get_authToken1)
        {
            this.get_authTokenAsync(get_authToken1, null);
        }

        /// <remarks/>
        public void get_authTokenAsync(get_authToken get_authToken1, object userState)
        {
            if ((this.get_authTokenOperationCompleted == null))
            {
                this.get_authTokenOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_authTokenOperationCompleted);
            }
            this.InvokeAsync("get_authToken", new object[] {
                    get_authToken1}, this.get_authTokenOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_publisherAssertions", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("publisherAssertions", Namespace = "urn:uddi-org:api_v2")]
        public publisherAssertions get_publisherAssertions([System.Xml.Serialization.XmlElementAttribute("get_publisherAssertions", Namespace = "urn:uddi-org:api_v2")] get_publisherAssertions get_publisherAssertions1)
        {
            object[] results = this.Invoke("get_publisherAssertions", new object[] {
                    get_publisherAssertions1});
            return ((publisherAssertions)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_publisherAssertionsAsync(get_publisherAssertions get_publisherAssertions1)
        {
            this.get_publisherAssertionsAsync(get_publisherAssertions1, null);
        }

        /// <remarks/>
        public void get_publisherAssertionsAsync(get_publisherAssertions get_publisherAssertions1, object userState)
        {
            if ((this.get_publisherAssertionsOperationCompleted == null))
            {
                this.get_publisherAssertionsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_publisherAssertionsOperationCompleted);
            }
            this.InvokeAsync("get_publisherAssertions", new object[] {
                    get_publisherAssertions1}, this.get_publisherAssertionsOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("get_registeredInfo", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("registeredInfo", Namespace = "urn:uddi-org:api_v2")]
        public registeredInfo get_registeredInfo([System.Xml.Serialization.XmlElementAttribute("get_registeredInfo", Namespace = "urn:uddi-org:api_v2")] get_registeredInfo get_registeredInfo1)
        {
            object[] results = this.Invoke("get_registeredInfo", new object[] {
                    get_registeredInfo1});
            return ((registeredInfo)(results[0]));
        }

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

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

        /// <remarks/>
        public void get_registeredInfoAsync(get_registeredInfo get_registeredInfo1)
        {
            this.get_registeredInfoAsync(get_registeredInfo1, null);
        }

        /// <remarks/>
        public void get_registeredInfoAsync(get_registeredInfo get_registeredInfo1, object userState)
        {
            if ((this.get_registeredInfoOperationCompleted == null))
            {
                this.get_registeredInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.Onget_registeredInfoOperationCompleted);
            }
            this.InvokeAsync("get_registeredInfo", new object[] {
                    get_registeredInfo1}, this.get_registeredInfoOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_binding", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("bindingDetail", Namespace = "urn:uddi-org:api_v2")]
        public bindingDetail save_binding([System.Xml.Serialization.XmlElementAttribute("save_binding", Namespace = "urn:uddi-org:api_v2")] save_binding save_binding1)
        {
            object[] results = this.Invoke("save_binding", new object[] {
                    save_binding1});
            return ((bindingDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void save_bindingAsync(save_binding save_binding1)
        {
            this.save_bindingAsync(save_binding1, null);
        }

        /// <remarks/>
        public void save_bindingAsync(save_binding save_binding1, object userState)
        {
            if ((this.save_bindingOperationCompleted == null))
            {
                this.save_bindingOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_bindingOperationCompleted);
            }
            this.InvokeAsync("save_binding", new object[] {
                    save_binding1}, this.save_bindingOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_business", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("businessDetail", Namespace = "urn:uddi-org:api_v2")]
        public businessDetail save_business([System.Xml.Serialization.XmlElementAttribute("save_business", Namespace = "urn:uddi-org:api_v2")] save_business save_business1)
        {
            object[] results = this.Invoke("save_business", new object[] {
                    save_business1});
            return ((businessDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void save_businessAsync(save_business save_business1)
        {
            this.save_businessAsync(save_business1, null);
        }

        /// <remarks/>
        public void save_businessAsync(save_business save_business1, object userState)
        {
            if ((this.save_businessOperationCompleted == null))
            {
                this.save_businessOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_businessOperationCompleted);
            }
            this.InvokeAsync("save_business", new object[] {
                    save_business1}, this.save_businessOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_service", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("serviceDetail", Namespace = "urn:uddi-org:api_v2")]
        public serviceDetail save_service([System.Xml.Serialization.XmlElementAttribute("save_service", Namespace = "urn:uddi-org:api_v2")] save_service save_service1)
        {
            object[] results = this.Invoke("save_service", new object[] {
                    save_service1});
            return ((serviceDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void save_serviceAsync(save_service save_service1)
        {
            this.save_serviceAsync(save_service1, null);
        }

        /// <remarks/>
        public void save_serviceAsync(save_service save_service1, object userState)
        {
            if ((this.save_serviceOperationCompleted == null))
            {
                this.save_serviceOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_serviceOperationCompleted);
            }
            this.InvokeAsync("save_service", new object[] {
                    save_service1}, this.save_serviceOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("save_tModel", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("tModelDetail", Namespace = "urn:uddi-org:api_v2")]
        public tModelDetail save_tModel([System.Xml.Serialization.XmlElementAttribute("save_tModel", Namespace = "urn:uddi-org:api_v2")] save_tModel save_tModel1)
        {
            object[] results = this.Invoke("save_tModel", new object[] {
                    save_tModel1});
            return ((tModelDetail)(results[0]));
        }

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

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

        /// <remarks/>
        public void save_tModelAsync(save_tModel save_tModel1)
        {
            this.save_tModelAsync(save_tModel1, null);
        }

        /// <remarks/>
        public void save_tModelAsync(save_tModel save_tModel1, object userState)
        {
            if ((this.save_tModelOperationCompleted == null))
            {
                this.save_tModelOperationCompleted = new System.Threading.SendOrPostCallback(this.Onsave_tModelOperationCompleted);
            }
            this.InvokeAsync("save_tModel", new object[] {
                    save_tModel1}, this.save_tModelOperationCompleted, userState);
        }

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

        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("set_publisherAssertions", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("publisherAssertions", Namespace = "urn:uddi-org:api_v2")]
        public publisherAssertions set_publisherAssertions([System.Xml.Serialization.XmlElementAttribute("set_publisherAssertions", Namespace = "urn:uddi-org:api_v2")] set_publisherAssertions set_publisherAssertions1)
        {
            object[] results = this.Invoke("set_publisherAssertions", new object[] {
                    set_publisherAssertions1});
            return ((publisherAssertions)(results[0]));
        }

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

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

        /// <remarks/>
        public void set_publisherAssertionsAsync(set_publisherAssertions set_publisherAssertions1)
        {
            this.set_publisherAssertionsAsync(set_publisherAssertions1, null);
        }

        /// <remarks/>
        public void set_publisherAssertionsAsync(set_publisherAssertions set_publisherAssertions1, object userState)
        {
            if ((this.set_publisherAssertionsOperationCompleted == null))
            {
                this.set_publisherAssertionsOperationCompleted = new System.Threading.SendOrPostCallback(this.Onset_publisherAssertionsOperationCompleted);
            }
            this.InvokeAsync("set_publisherAssertions", new object[] {
                    set_publisherAssertions1}, this.set_publisherAssertionsOperationCompleted, userState);
        }

        private void Onset_publisherAssertionsOperationCompleted(object arg)
        {
            if ((this.set_publisherAssertionsCompleted != null))
            {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.set_publisherAssertionsCompleted(this, new set_publisherAssertionsCompletedEventArgs(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:uddi-org:api_v2")]
    public partial class find_binding
    {

        private string[] findQualifiersField;

        private string[] tModelBagField;

        private string genericField;

        private int maxRowsField;

        private bool maxRowsFieldSpecified;

        private string serviceKeyField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("findQualifier", IsNullable = false)]
        public string[] findQualifiers
        {
            get
            {
                return this.findQualifiersField;
            }
            set
            {
                this.findQualifiersField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("tModelKey", IsNullable = false)]
        public string[] tModelBag
        {
            get
            {
                return this.tModelBagField;
            }
            set
            {
                this.tModelBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int maxRows
        {
            get
            {
                return this.maxRowsField;
            }
            set
            {
                this.maxRowsField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string serviceKey
        {
            get
            {
                return this.serviceKeyField;
            }
            set
            {
                this.serviceKeyField = 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_v2")]
    public partial class set_publisherAssertions
    {

        private string authInfoField;

        private publisherAssertion[] publisherAssertionField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class publisherAssertion
    {

        private string fromKeyField;

        private string toKeyField;

        private keyedReference keyedReferenceField;

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

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

        /// <remarks/>
        public keyedReference keyedReference
        {
            get
            {
                return this.keyedReferenceField;
            }
            set
            {
                this.keyedReferenceField = 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_v2")]
    public partial class keyedReference
    {

        private string tModelKeyField;

        private string keyNameField;

        private string keyValueField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string keyValue
        {
            get
            {
                return this.keyValueField;
            }
            set
            {
                this.keyValueField = 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_v2")]
    public partial class save_tModel
    {

        private string authInfoField;

        private tModel[] tModelField;

        private string[] uploadRegisterField;

        private string genericField;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class tModel
    {

        private name nameField;

        private description[] descriptionField;

        private overviewDoc overviewDocField;

        private keyedReference[] identifierBagField;

        private keyedReference[] categoryBagField;

        private string tModelKeyField;

        private string operatorField;

        private string authorizedNameField;

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

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

        /// <remarks/>
        public overviewDoc overviewDoc
        {
            get
            {
                return this.overviewDocField;
            }
            set
            {
                this.overviewDocField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] identifierBag
        {
            get
            {
                return this.identifierBagField;
            }
            set
            {
                this.identifierBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = 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:uddi-org:api_v2")]
    public partial class name
    {

        private string langField;

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/XML/1998/namespace")]
        public string lang
        {
            get
            {
                return this.langField;
            }
            set
            {
                this.langField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class description
    {

        private string langField;

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/XML/1998/namespace")]
        public string lang
        {
            get
            {
                return this.langField;
            }
            set
            {
                this.langField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class overviewDoc
    {

        private description[] descriptionField;

        private string overviewURLField;

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

        /// <remarks/>
        public string overviewURL
        {
            get
            {
                return this.overviewURLField;
            }
            set
            {
                this.overviewURLField = 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_v2")]
    public partial class save_service
    {

        private string authInfoField;

        private businessService[] businessServiceField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class businessService
    {

        private name[] nameField;

        private description[] descriptionField;

        private bindingTemplate[] bindingTemplatesField;

        private keyedReference[] categoryBagField;

        private string serviceKeyField;

        private string businessKeyField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public bindingTemplate[] bindingTemplates
        {
            get
            {
                return this.bindingTemplatesField;
            }
            set
            {
                this.bindingTemplatesField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string businessKey
        {
            get
            {
                return this.businessKeyField;
            }
            set
            {
                this.businessKeyField = 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_v2")]
    public partial class bindingTemplate
    {

        private description[] descriptionField;

        private object itemField;

        private tModelInstanceInfo[] tModelInstanceDetailsField;

        private string serviceKeyField;

        private string bindingKeyField;

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

        /// <summary>
        /// accessPoint or hostingRedirector
        /// </summary>
        [System.Xml.Serialization.XmlElementAttribute("accessPoint", typeof(accessPoint))]
        [System.Xml.Serialization.XmlElementAttribute("hostingRedirector", typeof(hostingRedirector))]
        public object Item
        {
            get
            {
                return this.itemField;
            }
            set
            {
                this.itemField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public tModelInstanceInfo[] tModelInstanceDetails
        {
            get
            {
                return this.tModelInstanceDetailsField;
            }
            set
            {
                this.tModelInstanceDetailsField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string bindingKey
        {
            get
            {
                return this.bindingKeyField;
            }
            set
            {
                this.bindingKeyField = 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_v2")]
    public partial class accessPoint
    {

        private URLType uRLTypeField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

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

        /// <remarks/>
        mailto,

        /// <remarks/>
        http,

        /// <remarks/>
        https,

        /// <remarks/>
        ftp,

        /// <remarks/>
        fax,

        /// <remarks/>
        phone,

        /// <remarks/>
        other,
    }

    /// <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_v2")]
    public partial class hostingRedirector
    {

        private string bindingKeyField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string bindingKey
        {
            get
            {
                return this.bindingKeyField;
            }
            set
            {
                this.bindingKeyField = 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_v2")]
    public partial class tModelInstanceInfo
    {

        private description[] descriptionField;

        private instanceDetails instanceDetailsField;

        private string tModelKeyField;

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

        /// <remarks/>
        public instanceDetails instanceDetails
        {
            get
            {
                return this.instanceDetailsField;
            }
            set
            {
                this.instanceDetailsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        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:uddi-org:api_v2")]
    public partial class instanceDetails
    {

        private description[] descriptionField;

        private overviewDoc overviewDocField;

        private string instanceParmsField;

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

        /// <remarks/>
        public overviewDoc overviewDoc
        {
            get
            {
                return this.overviewDocField;
            }
            set
            {
                this.overviewDocField = value;
            }
        }

        /// <remarks/>
        public string instanceParms
        {
            get
            {
                return this.instanceParmsField;
            }
            set
            {
                this.instanceParmsField = 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_v2")]
    public partial class save_business
    {

        private string authInfoField;

        private businessEntity[] businessEntityField;

        private string[] uploadRegisterField;

        private string genericField;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class businessEntity
    {

        private discoveryURL[] discoveryURLsField;

        private name[] nameField;

        private description[] descriptionField;

        private contact[] contactsField;

        private businessService[] businessServicesField;

        private keyedReference[] identifierBagField;

        private keyedReference[] categoryBagField;

        private string businessKeyField;

        private string operatorField;

        private string authorizedNameField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public discoveryURL[] discoveryURLs
        {
            get
            {
                return this.discoveryURLsField;
            }
            set
            {
                this.discoveryURLsField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public contact[] contacts
        {
            get
            {
                return this.contactsField;
            }
            set
            {
                this.contactsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public businessService[] businessServices
        {
            get
            {
                return this.businessServicesField;
            }
            set
            {
                this.businessServicesField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] identifierBag
        {
            get
            {
                return this.identifierBagField;
            }
            set
            {
                this.identifierBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = 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:uddi-org:api_v2")]
    public partial class discoveryURL
    {

        private string useTypeField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class contact
    {

        private description[] descriptionField;

        private string personNameField;

        private phone[] phoneField;

        private email[] emailField;

        private address[] addressField;

        private string useTypeField;

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

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

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string useType
        {
            get
            {
                return this.useTypeField;
            }
            set
            {
                this.useTypeField = 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_v2")]
    public partial class phone
    {

        private string useTypeField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class email
    {

        private string useTypeField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class address
    {

        private addressLine[] addressLineField;

        private string useTypeField;

        private string sortCodeField;

        private string tModelKeyField;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        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:uddi-org:api_v2")]
    public partial class addressLine
    {

        private string keyNameField;

        private string keyValueField;

        private string valueField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class save_binding
    {

        private string authInfoField;

        private bindingTemplate[] bindingTemplateField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class registeredInfo
    {

        private businessInfo[] businessInfosField;

        private tModelInfo[] tModelInfosField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public businessInfo[] businessInfos
        {
            get
            {
                return this.businessInfosField;
            }
            set
            {
                this.businessInfosField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public tModelInfo[] tModelInfos
        {
            get
            {
                return this.tModelInfosField;
            }
            set
            {
                this.tModelInfosField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class businessInfo
    {

        private name[] nameField;

        private description[] descriptionField;

        private serviceInfo[] serviceInfosField;

        private string businessKeyField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public serviceInfo[] serviceInfos
        {
            get
            {
                return this.serviceInfosField;
            }
            set
            {
                this.serviceInfosField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string businessKey
        {
            get
            {
                return this.businessKeyField;
            }
            set
            {
                this.businessKeyField = 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_v2")]
    public partial class serviceInfo
    {

        private name[] nameField;

        private string serviceKeyField;

        private string businessKeyField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string businessKey
        {
            get
            {
                return this.businessKeyField;
            }
            set
            {
                this.businessKeyField = 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_v2")]
    public partial class tModelInfo
    {

        private name nameField;

        private string tModelKeyField;

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

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

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

        /// <remarks/>
        @true,

        /// <remarks/>
        @false,
    }

    /// <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_v2")]
    public partial class get_registeredInfo
    {

        private string authInfoField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class publisherAssertions
    {

        private publisherAssertion[] publisherAssertionField;

        private string genericField;

        private string operatorField;

        private string authorizedNameField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = 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:uddi-org:api_v2")]
    public partial class get_publisherAssertions
    {

        private string authInfoField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class authToken
    {

        private string authInfoField;

        private string genericField;

        private string operatorField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = 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_v2")]
    public partial class get_authToken
    {

        private string genericField;

        private string userIDField;

        private string credField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string cred
        {
            get
            {
                return this.credField;
            }
            set
            {
                this.credField = 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_v2")]
    public partial class keysOwned
    {

        private string fromKeyField;

        private string toKeyField;

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

        /// <remarks/>
        public string toKey
        {
            get
            {
                return this.toKeyField;
            }
            set
            {
                this.toKeyField = 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_v2")]
    public partial class assertionStatusItem
    {

        private string fromKeyField;

        private string toKeyField;

        private keyedReference keyedReferenceField;

        private keysOwned keysOwnedField;

        private string completionStatusField;

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

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

        /// <remarks/>
        public keyedReference keyedReference
        {
            get
            {
                return this.keyedReferenceField;
            }
            set
            {
                this.keyedReferenceField = value;
            }
        }

        /// <remarks/>
        public keysOwned keysOwned
        {
            get
            {
                return this.keysOwnedField;
            }
            set
            {
                this.keysOwnedField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string completionStatus
        {
            get
            {
                return this.completionStatusField;
            }
            set
            {
                this.completionStatusField = 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_v2")]
    public partial class assertionStatusReport
    {

        private assertionStatusItem[] assertionStatusItemField;

        private string genericField;

        private string operatorField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string @operator
        {
            get
            {
                return this.operatorField;
            }
            set
            {
                this.operatorField = 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_v2")]
    public partial class get_assertionStatusReport
    {

        private string authInfoField;

        private string completionStatusField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class discard_authToken
    {

        private string authInfoField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class delete_tModel
    {

        private string authInfoField;

        private string[] tModelKeyField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class delete_service
    {

        private string authInfoField;

        private string[] serviceKeyField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class delete_publisherAssertions
    {

        private string authInfoField;

        private publisherAssertion[] publisherAssertionField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class delete_business
    {

        private string authInfoField;

        private string[] businessKeyField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class delete_binding
    {

        private string authInfoField;

        private string[] bindingKeyField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class errInfo
    {

        private string errCodeField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = 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_v2")]
    public partial class result
    {

        private errInfo errInfoField;

        private keyType keyTypeField;

        private bool keyTypeFieldSpecified;

        private int errnoField;

        /// <remarks/>
        public errInfo errInfo
        {
            get
            {
                return this.errInfoField;
            }
            set
            {
                this.errInfoField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int errno
        {
            get
            {
                return this.errnoField;
            }
            set
            {
                this.errnoField = value;
            }
        }
    }

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

        /// <remarks/>
        businessKey,

        /// <remarks/>
        tModelKey,

        /// <remarks/>
        serviceKey,

        /// <remarks/>
        bindingKey,
    }

    /// <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_v2")]
    public partial class dispositionReport
    {

        private result[] resultField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class add_publisherAssertions
    {

        private string authInfoField;

        private publisherAssertion[] publisherAssertionField;

        private string genericField;

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class tModelDetail
    {

        private tModel[] tModelField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class get_tModelDetail
    {

        private string[] tModelKeyField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class serviceDetail
    {

        private businessService[] businessServiceField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class get_serviceDetail
    {

        private string[] serviceKeyField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class businessEntityExt
    {

        private businessEntity businessEntityField;

        private System.Xml.XmlElement[] anyField;

        /// <remarks/>
        public businessEntity businessEntity
        {
            get
            {
                return this.businessEntityField;
            }
            set
            {
                this.businessEntityField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement[] Any
        {
            get
            {
                return this.anyField;
            }
            set
            {
                this.anyField = 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_v2")]
    public partial class businessDetailExt
    {

        private businessEntityExt[] businessEntityExtField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class get_businessDetailExt
    {

        private string[] businessKeyField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class businessDetail
    {

        private businessEntity[] businessEntityField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class get_businessDetail
    {

        private string[] businessKeyField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class get_bindingDetail
    {

        private string[] bindingKeyField;

        private string genericField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string generic
        {
            get
            {
                return this.genericField;
            }
            set
            {
                this.genericField = 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_v2")]
    public partial class tModelList
    {

        private tModelInfo[] tModelInfosField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public tModelInfo[] tModelInfos
        {
            get
            {
                return this.tModelInfosField;
            }
            set
            {
                this.tModelInfosField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class find_tModel
    {

        private string[] findQualifiersField;

        private name nameField;

        private keyedReference[] identifierBagField;

        private keyedReference[] categoryBagField;

        private string genericField;

        private int maxRowsField;

        private bool maxRowsFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("findQualifier", IsNullable = false)]
        public string[] findQualifiers
        {
            get
            {
                return this.findQualifiersField;
            }
            set
            {
                this.findQualifiersField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] identifierBag
        {
            get
            {
                return this.identifierBagField;
            }
            set
            {
                this.identifierBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int maxRows
        {
            get
            {
                return this.maxRowsField;
            }
            set
            {
                this.maxRowsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxRowsSpecified
        {
            get
            {
                return this.maxRowsFieldSpecified;
            }
            set
            {
                this.maxRowsFieldSpecified = 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_v2")]
    public partial class serviceList
    {

        private serviceInfo[] serviceInfosField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public serviceInfo[] serviceInfos
        {
            get
            {
                return this.serviceInfosField;
            }
            set
            {
                this.serviceInfosField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class find_service
    {

        private string[] findQualifiersField;

        private name[] nameField;

        private keyedReference[] categoryBagField;

        private string[] tModelBagField;

        private string genericField;

        private int maxRowsField;

        private bool maxRowsFieldSpecified;

        private string businessKeyField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("findQualifier", IsNullable = false)]
        public string[] findQualifiers
        {
            get
            {
                return this.findQualifiersField;
            }
            set
            {
                this.findQualifiersField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("tModelKey", IsNullable = false)]
        public string[] tModelBag
        {
            get
            {
                return this.tModelBagField;
            }
            set
            {
                this.tModelBagField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int maxRows
        {
            get
            {
                return this.maxRowsField;
            }
            set
            {
                this.maxRowsField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string businessKey
        {
            get
            {
                return this.businessKeyField;
            }
            set
            {
                this.businessKeyField = 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_v2")]
    public partial class sharedRelationships
    {

        private keyedReference[] keyedReferenceField;

        private direction directionField;

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

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

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

        /// <remarks/>
        fromKey,

        /// <remarks/>
        toKey,
    }

    /// <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_v2")]
    public partial class relatedBusinessInfo
    {

        private string businessKeyField;

        private name[] nameField;

        private description[] descriptionField;

        private sharedRelationships[] sharedRelationshipsField;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("sharedRelationships")]
        public sharedRelationships[] sharedRelationships
        {
            get
            {
                return this.sharedRelationshipsField;
            }
            set
            {
                this.sharedRelationshipsField = 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_v2")]
    public partial class relatedBusinessesList
    {

        private string businessKeyField;

        private relatedBusinessInfo[] relatedBusinessInfosField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public relatedBusinessInfo[] relatedBusinessInfos
        {
            get
            {
                return this.relatedBusinessInfosField;
            }
            set
            {
                this.relatedBusinessInfosField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class find_relatedBusinesses
    {

        private string[] findQualifiersField;

        private string businessKeyField;

        private keyedReference keyedReferenceField;

        private string genericField;

        private int maxRowsField;

        private bool maxRowsFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("findQualifier", IsNullable = false)]
        public string[] findQualifiers
        {
            get
            {
                return this.findQualifiersField;
            }
            set
            {
                this.findQualifiersField = value;
            }
        }

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

        /// <remarks/>
        public keyedReference keyedReference
        {
            get
            {
                return this.keyedReferenceField;
            }
            set
            {
                this.keyedReferenceField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int maxRows
        {
            get
            {
                return this.maxRowsField;
            }
            set
            {
                this.maxRowsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxRowsSpecified
        {
            get
            {
                return this.maxRowsFieldSpecified;
            }
            set
            {
                this.maxRowsFieldSpecified = 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_v2")]
    public partial class businessList
    {

        private businessInfo[] businessInfosField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public businessInfo[] businessInfos
        {
            get
            {
                return this.businessInfosField;
            }
            set
            {
                this.businessInfosField = value;
            }
        }

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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:uddi-org:api_v2")]
    public partial class find_business
    {

        private string[] findQualifiersField;

        private name[] nameField;

        private keyedReference[] identifierBagField;

        private keyedReference[] categoryBagField;

        private string[] tModelBagField;

        private discoveryURL[] discoveryURLsField;

        private string genericField;

        private int maxRowsField;

        private bool maxRowsFieldSpecified;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("findQualifier", IsNullable = false)]
        public string[] findQualifiers
        {
            get
            {
                return this.findQualifiersField;
            }
            set
            {
                this.findQualifiersField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] identifierBag
        {
            get
            {
                return this.identifierBagField;
            }
            set
            {
                this.identifierBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public keyedReference[] categoryBag
        {
            get
            {
                return this.categoryBagField;
            }
            set
            {
                this.categoryBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("tModelKey", IsNullable = false)]
        public string[] tModelBag
        {
            get
            {
                return this.tModelBagField;
            }
            set
            {
                this.tModelBagField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
        public discoveryURL[] discoveryURLs
        {
            get
            {
                return this.discoveryURLsField;
            }
            set
            {
                this.discoveryURLsField = value;
            }
        }

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public int maxRows
        {
            get
            {
                return this.maxRowsField;
            }
            set
            {
                this.maxRowsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public bool maxRowsSpecified
        {
            get
            {
                return this.maxRowsFieldSpecified;
            }
            set
            {
                this.maxRowsFieldSpecified = 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_v2")]
    public partial class bindingDetail
    {

        private bindingTemplate[] bindingTemplateField;

        private string genericField;

        private string operatorField;

        private truncated truncatedField;

        private bool truncatedFieldSpecified;

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

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

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public truncated 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")]
    public delegate void find_bindingCompletedEventHandler(object sender, find_bindingCompletedEventArgs e);

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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

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

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

        private object[] results;

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

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